Python的subprocess子进程和管道进行交互
在很久以前,我寫了一個系列,Python和C和C++的交互,如下
http://blog.csdn.net/marising/archive/2008/08/28/2845339.aspx
目的是解決Python和C/C++的互操作性的問題,假如性能瓶頸的地方用C來寫,而一些外圍工作用Python來完成,豈不是完美的結合。
今天發現了更方便的方式,就是用subprocess模塊,創建子進程,然后用管道來進行交互,而這種方式在shell中非常普遍,比如:cat xxx.file | test.py?就是用的管道,另外,在hadoop中stream模式就是用的管道。
其實在python中,和shell腳本,其他程序交互的方式有很多,比如:
os.system(cmd),os.system只是執行一個shell命令,不能輸入、且無返回
os.open(cmd),可以交互,但是是一次性的,調用都少次都會創建和銷毀多少次進程,性能太差
?
所以,建議用subprocess,但是subprocess復雜一些,可以參考python docs:
http://docs.python.org/library/subprocess.html
?
先看一個簡單的例子,調用ls命令,兩者之間是沒有交互的:
[python] view plaincopy再看在程序中獲取輸出的例子:
[c-sharp] view plaincopy再看看有輸入,有輸出的例子,父進程發送'say hi',子進程輸出 test say hi,父進程獲取輸出并打印
?
[python] view plaincopy看看連續輸入和輸出的例子
test.py
[python] view plaincopyrun.py
[python] view plaincopy注意,run.py的flush和test.py中的flush,要記得清空緩沖區,否則程序得不到正確的輸入和輸出
?
C/C++的類似,偽代碼如下
[cpp] view plaincopyPopen對象
該對象提供有不少方法函數可用。而且前面已經用到了wait()/poll()/communicate()
| poll() | 檢查是否結束,設置返回值 |
| wait() | 等待結束,設置返回值 |
| communicate() | 參數是標準輸入,返回標準輸出和標準出錯 |
| send_signal() | 發送信號 (主要在unix下有用) |
| terminate() | 終止進程,unix對應的SIGTERM信號,windows下調用api函數TerminateProcess() |
| kill() | 殺死進程(unix對應SIGKILL信號),windows下同上 |
| stdin | 參數中指定PIPE時,有用 |
| pid | 進程id |
| returncode | 進程返回值 |
參考
?
Popen其他參數的設置,請參考python docs。
轉載于:https://www.cnblogs.com/chenjianhong/p/4144476.html
總結
以上是生活随笔為你收集整理的Python的subprocess子进程和管道进行交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Android事件分发机制完全解析
- 下一篇: Delegate,Action,Func