日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python的subprocess子进程和管道进行交互

發布時間:2025/6/17 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • import?subprocess??
  • p?=?subprocess.Popen('ls')??
  • ?

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

    [c-sharp] view plaincopy
  • import?subprocess??
  • p?=?subprocess.Popen('ls',stdout=subprocess.PIPE)??
  • print?p.stdout.readlines()??
  • ?

    再看看有輸入,有輸出的例子,父進程發送'say hi',子進程輸出 test say hi,父進程獲取輸出并打印

    ?

    [python] view plaincopy
  • #test1.py??
  • import?sys??
  • line?=?sys.stdin.readline()??
  • print?'test',line??
  • #run.py??
  • from?subprocess?import?*??
  • p?=Popen('./test1.py',stdin=PIPE,stdout=PIPE)??
  • p.stdin.write('say?hi/n')??
  • print?p.stdout.readline()??
  • #result??
  • test?say?hi??
  • ?

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

    test.py

    [python] view plaincopy
  • import?sys??
  • while?True:??
  • ????????line?=?sys.stdin.readline()??
  • ????????if?not?line:break??
  • ????????sys.stdout.write(line)??
  • ????????sys.stdout.flush()??
  • ?

    run.py

    [python] view plaincopy
  • import?sys??
  • from?subprocess?import?*??
  • proc?=?Popen('./test.py',stdin=PIPE,stdout=PIPE,shell=True)??
  • for?line?in?sys.stdin:??
  • ????????proc.stdin.write(line)??
  • ????????proc.stdin.flush()??
  • ????????output?=?proc.stdout.readline()??
  • ????????sys.stdout.write(output)??
  • ?

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

    ?

    C/C++的類似,偽代碼如下

    [cpp] view plaincopy
  • char*?line?=?new?char[2048];??
  • while?(fgets(line,?2028,?stdin))?{??
  • ????printf(line);??
  • ????fflush(stdout);//必須清空緩沖區??
  • }??
  • ?

    Popen對象

    該對象提供有不少方法函數可用。而且前面已經用到了wait()/poll()/communicate()

    poll()

    檢查是否結束,設置返回值

    wait()

    等待結束,設置返回值

    communicate()

    參數是標準輸入,返回標準輸出和標準出錯

    send_signal()

    發送信號 (主要在unix下有用)

    terminate()

    終止進程,unix對應的SIGTERM信號,windows下調用api函數TerminateProcess()

    kill()

    殺死進程(unix對應SIGKILL信號),windows下同上

    stdin
    stdout
    stderr

    參數中指定PIPE時,有用

    pid

    進程id

    returncode

    進程返回值

    參考

    ?

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

    轉載于:https://www.cnblogs.com/chenjianhong/p/4144476.html

    總結

    以上是生活随笔為你收集整理的Python的subprocess子进程和管道进行交互的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。