python子進程輸出
⑴ python shell怎麼使用
Python 中執行 Shell 命令有多種方法,stackoverflow 上有對這些方法進行比較的討論,Calling an external command in Python 指出使用subprocess模塊來實現更優。因此,本文說明如何使用subprocess模塊來實現 Shell 腳本的功能。
subprocess模塊提供多種方法來實現執行 Linux 的命令,例如subprocess.call()方法,subprocess.check_call()方法,等。這些方法都是對Popen類的封裝,故本文著重講述Popen類的使用。
執行 Shell 命令
可以通過向Popen()傳遞需要執行的命令來創建一個Popen對象,這樣,便會創建一個子進程來執行命令。例如:
child = subprocess.Popen(["ping","-c","5","leehao.me"])
1
上面的代碼會創建一個子進程來執行ping -c 5 leehao.me命令,這個命令採用列表的形式傳遞給Popen()方法。如果我們想直接採用ping -c 5 leehao.me字元串形式,可以添加shell=True來實現:
child = subprocess.Popen("ping -c 5 leehao.me", shell=True)
1
官方文檔指出由於安全原因故不建議使用shell=True,詳細說明可以參考官方文檔的描述。
等待子進程執行
子進程執行命令後,主進程並不會等待子進程執行。為了讓主進程等待子進程執行結束,需要顯示調用Popen.wait()方法。例如:
child = subprocess.Popen(["ping","-c","5","leehao.me"])
child.wait()
print 'parent finish'
1
2
3
這樣,主進程會等待子進程執行ping命令完畢後,才會列印出parent finish的輸出。
獲取執行結果
為了獲取Popen()子進程的輸出,可以使用Popen.communicate()方法,例如:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
print proc_stdout
subprocess_cmd('echo leehao.me; echo www.leehao.me')
1
2
3
4
5
6
輸出:
leehao.me
www.leehao.me
process.communicate()方法可以實現主進程與子進程的通信。主進程可以通過它向子進程發送數據,也可以讀取子進程的輸出的數據。上面的例子中,我們在創建Popen對象時指定stdout=subprocess.PIPE,這樣主進程便可以讀取子進程的輸出。
communicate()方法返回一個元組:(stdoutdata, stderrdata),process.communicate()[0]即獲取子進程的標准輸出。
需要指出的是,調用communicate()方法後,主進程也會等待子進程執行完畢。
上面的例子中,子進程向標准輸出列印兩個字元串,主進程接收到了這些輸出,並列印出來。
⑵ python 怎麼啟動一個外部命令程序,並且不阻塞當前進程
在Python中,我們通過標准庫中的subprocess包來fork一個子進程,並運行一個外部的程序。
使用subprocess包中的函數創建子進程的時候,要注意:
1) 在創建子進程之後,父進程是否暫停,並等待子進程運行。
2) 函數返回什麼
3) 當returncode不為0時,父進程如何處理。
subprocess.call()
父進程等待子進程完成
返回退出信息
subprocess.check_call()
父進程等待子進程完成
返回0
檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含有returncode屬性,可用try...except...來檢查。
subprocess.check_output()
父進程等待子進程完成
返回子進程向標准輸出的輸出結果
檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含有returncode屬性和output屬性,output屬性為標准輸出的輸出結果,可用try...except...來檢查。
這三個函數的使用方法相類似,我們以subprocess.call()來說明:
importsubprocess
rc=subprocess.call(["ls","-l"])
實際上,我們上面的三個函數都是基於Popen()的封裝(wrapper)。這些封裝的目的在於讓我們容易使用子進程。當我們想要更個性化我們的需求的時候,就要轉向Popen類,該類生成的對象用來代表子進程。
與上面的封裝不同,Popen對象創建後,主程序不會自動等待子進程完成。我們必須調用對象的wait()方法,父進程才會等待 (也就是阻塞block):
importsubprocess
child=subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parentprocess")
此外,你還可以在父進程中對子進程進行其它操作,比如我們上面例子中的child對象:
child.poll() # 檢查子進程狀態
child.kill() # 終止子進程
child.send_signal()# 向子進程發送信號
child.terminate() # 終止子進程
因此,如果不希望當前進程被阻塞,你可以使用Popen對象進行操作。
⑶ python子進程怎麼傳參
def sum(x,y):
return x+y
def sub (x,y):
return x-y
def jieguo(x,y):
print(「和值:」,sum(x,y))
Print("差值:",sub(x,y))
jieguo(45,22)
#sum函數,sub函數 分別是jieguo函數的子函數。
用return 就可以啦
⑷ python,子進程Process()中的print()沒有列印結果,什麼原因
IDLE不能顯示子進程(調用Process的子進程)列印的信息。
解決辦法1:直接把.py文件拖入cmd命令窗口,用cmd命令窗口運行Python程序
解決辦法2:安裝PyCharm,在PyCharm中運行
以上兩種方法都不能列印進程池Pool調用apply_async方法執行的子進程的信息