當前位置:首頁 » 編程語言 » python子進程輸出

python子進程輸出

發布時間: 2023-09-08 16:41:40

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方法執行的子進程的信息

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:235
java駝峰 發布:2025-02-02 09:13:26 瀏覽:651
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726