一、使用subprocess模塊的Popen函數進行子進程執行命令
在Python程序中,使用subprocess模塊的Popen函數可以方便地調用系統命令並執行,同時也能夠獲取命令執行的結果。
import subprocess # 執行系統命令ls,並獲取輸出結果 p = subprocess.Popen('ls', stdout=subprocess.PIPE) result = p.communicate()[0].splitlines() # 輸出命令執行結果 for line in result: print(line.decode('utf-8'))
使用Popen函數的時候,可以通過傳入不同的參數來控制命令的執行方式以及獲取執行結果。
- args:要執行的命令,可以是字元串,也可以是一個列表(參數用空格分割)。
- stdout:可以將命令的輸出重定向到一個文件,也可以直接獲取命令輸出的結果。
- stderr:可以將命令的錯誤輸出重定向到一個文件,也可以直接獲取命令錯誤輸出的結果。
- stdin:可以將一個字元串或文件描述符傳遞給被執行的進程,以供輸入使用。
二、使用subprocess模塊的Popen函數執行腳本
除了執行單個命令外,還可以使用Popen函數來執行Python腳本或其他腳本文件。
import subprocess # 執行Python腳本example.py,並獲取輸出結果 p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE) result = p.communicate()[0].decode('utf-8') # 輸出命令執行結果 print(result)
上述代碼中,將Python解釋器和要執行的腳本文件名作為參數放在列表中傳遞給Popen函數,在執行過程中,可以通過stdout參數直接獲取命令輸出的結果。
三、使用subprocess模塊的run函數執行命令
除了Popen函數外,subprocess模塊還提供了run函數來執行命令,run函數是在Python 3.5版本中引入的。
import subprocess # 執行系統命令ls,並獲取輸出結果 result = subprocess.run(['ls'], stdout=subprocess.PIPE) # 輸出命令執行結果 print(result.stdout.decode('utf-8'))
與Popen函數一樣,run函數也可以接受不同的參數來控制命令的執行方式以及獲取執行結果。
四、使用subprocess模塊執行shell命令
在執行命令時,subprocess模塊默認是不執行shell命令的。如果需要執行shell命令,需要通過加入參數shell=True來實現。
import subprocess # 執行shell命令echo,並獲取輸出結果 result = subprocess.run('echo hello world', stdout=subprocess.PIPE, shell=True) # 輸出命令執行結果 print(result.stdout.decode('utf-8'))
在這裡,subprocess模塊會將需要執行的命令作為一個字元串傳遞給操作系統的shell命令,然後返回命令執行的結果。
五、使用subprocess模塊執行命令時的安全性問題
在使用subprocess模塊執行命令時,需要注意安全性問題,防止命令注入等攻擊。
通過控制要執行的命令參數,可以有效防止命令注入攻擊。在調用subprocess模塊的時候,避免使用shell=True參數,以免遭受攻擊。如果使用shell參數時,一定要保證輸入的命令參數是信任的,不能從網路或用戶輸入中直接傳入參數。
六、小結
在Python中,使用subprocess模塊的Popen函數可以方便地調用系統命令或腳本文件,同時可以獲取命令執行的結果。
為了保證命令執行的安全性,應該確保要執行的命令參數是可信的,避免使用shell=True參數,以免遭受命令注入等攻擊。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193731.html