1. 程式人生 > >Python的subprocess子程序和管道進行互動

Python的subprocess子程序和管道進行互動

在很久以前,我寫了一個系列,Python和C和C++的互動,如下

目的是解決Python和C/C++的互操作性的問題,假如效能瓶頸的地方用C來寫,而一些外圍工作用Python來完成,豈不是完美的結合。

今天發現了更方便的方式,就是用subprocess模組,建立子程序,然後用管道來進行互動,而這種方式在shell中非常普遍,比如:cat xxx.file | test.py 就是用的管道,另外,在hadoop中stream模式就是用的管道。

其實在python中,和shell指令碼,其他程式互動的方式有很多,比如:

os.system(cmd),os.system只是執行一個shell命令,不能輸入、且無返回

os.popen(cmd),可以互動,但是是一次性的,呼叫都少次都會建立和銷燬多少次程序,效能太差

所以,建議用subprocess,但是subprocess複雜一些,可以參考python docs:

先看一個簡單的例子,呼叫ls命令,兩者之間是沒有互動的:

 

再看在程式中獲取輸出的例子:

 

再看看有輸入,有輸出的例子,父程序傳送'say hi',子程序輸出 test say hi,父程序獲取輸出並列印

 

看看連續輸入和輸出的例子

test.py

 

run.py

 

注意,run.py的flush和test.py中的flush,要記得清空緩衝區,否則程式得不到正確的輸入和輸出

C/C++的類似,虛擬碼如下

 

Popen其他引數的設定,請參考python docs。

特別注意:Python 2.7的SubProcess用法修改了

https://docs.python.org/2/library/subprocess.html