亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python的subprocess模塊總結

系統 1575 0

subprocess意在替代其他幾個老的模塊或者函數,比如:os.system os.spawn* os.popen* popen2.* commands.*
subprocess最簡單的用法就是調用shell命令了,另外也可以調用程序,并且可以通過stdout,stdin和stderr進行交互。

subprocess的主類

復制代碼 代碼如下:

subprocess.Popen(
????? args,
????? bufsize=0,
????? executable=None,
????? stdin=None,
????? stdout=None,
????? stderr=None,
????? preexec_fn=None,
????? close_fds=False,
????? shell=False,
????? cwd=None,
????? env=None,
????? universal_newlines=False,
????? startupinfo=None,
????? creationflags=0)

1)、args 可以是字符串或者序列類型(如:list,元組),用于指定進程的可執行文件及其參數。如果是序列類型,第一個元素通常是可執行文件的路徑。我們也可以顯式的使用executeable參數來指定可執行文件的路徑。

2)、bufsize: 指定緩沖。0 無緩沖,1 行緩沖,其他 緩沖區大小,負值 系統緩沖(全緩沖)

3)、stdin, stdout, stderr 分別表示程序的標準輸入、輸出、錯誤句柄。他們可以是PIPE,文件描述符或文件對象,也可以設置為None,表示從父進程繼承。

4)、preexec_fn 只在Unix平臺下有效,用于指定一個可執行對象(callable object),它將在子進程運行之前被調用。

5)、Close_sfs: 在windows平臺下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。我們不能將close_fds設置為True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。

6)、shell 設為true,程序將通過shell來執行。

7)、cwd 用于設置子進程的當前目錄

8)、env 是字典類型,用于指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。
Universal_newlines:不同操作系統下,文本的換行符是不一樣的。如:windows下用'/r/n'表示換,而Linux下用'/n'。如果將此參數設置為True,Python統一把這些換行符當作'/n'來處理。startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數,用于設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。

9)、startupinfo與createionflags只在windows下有效 ,它們將被傳遞給底層的CreateProcess()函數,用于設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。

Popen方法

1)、Popen.poll(): 用于檢查子進程是否已經結束。設置并返回returncode屬性。

2)、Popen.wait(): 等待子進程結束。設置并返回returncode屬性。

3)、Popen.communicate(input=None): 與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據。可選參數input指定發送到子進程的參數。Communicate()返回一個元組:(stdoutdata, stderrdata)。注意:如果希望通過進程的stdin向其發送數據,在創建Popen對象的時候,參數stdin必須被設置為PIPE。同樣,如果希望從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。

4)、Popen.send_signal(signal): 向子進程發送信號。

5)、Popen.terminate(): 停止(stop)子進程。在windows平臺下,該方法將調用Windows API TerminateProcess()來結束子進程。

6)、Popen.kill(): 殺死子進程。

7)、Popen.stdin: 如果在創建Popen對象是,參數stdin被設置為PIPE,Popen.stdin將返回一個文件對象用于策子進程發送指令。否則返回None。

8)、Popen.stdout: 如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。

9)、Popen.stderr: 如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。

10)、Popen.pid: 獲取子進程的進程ID。

11)、Popen.returncode: 獲取進程的返回值。如果進程還沒有結束,返回None。

12)、subprocess.call(*popenargs, **kwargs): 運行命令。該函數將一直等待到子進程運行結束,并返回進程的returncode。文章一開始的例子就演示了call函數。如果子進程不需要進行交互,就可以使用該函數來創建。

13)、subprocess.check_call(*popenargs, **kwargs): 與subprocess.call(*popenargs, **kwargs)功能一樣,只是如果子進程返回的returncode不為0的話,將觸發CalledProcessError異常。在異常對象中,包括進程的returncode信息。

以上全是抄的

在程序中運行其他程序或shell

可以這樣寫

復制代碼 代碼如下:

subprocess.Popen('腳本/shell', shell=True)

也可以這樣

復制代碼 代碼如下:

subprocess.call('腳本/shell', shell=True)

兩者的區別是前者無阻塞,會和主程序并行運行,后者必須等待命令執行完畢,如果想要前者編程阻塞可以這樣
復制代碼 代碼如下:

s = subprocess.Popen('腳本/shell', shell=True)
s.wait()

程序返回運行結果

有時候我們需要程序的返回結果,可以這樣做。

復制代碼 代碼如下:

>>> s = subprocess.Popen('ls -l', shell=True, stdout=subprocess.PIPE)
>>> s.communicate()
('\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 152\n-rw------- 1 limbo limbo?? 808? 7\xe6\x9c\x88? 6 17:46 0000-00-00-welcome-to-jekyll.markdown.erb\ndrwx------ 2 limbo limbo? 4096? 8\xe6\x9c\x88 15 18:43 arg\ndrwx------ 2 limbo limbo? 4096? 8\xe6\x9c\x88? 7 17:37 argv\ndrwxrwxr-x 2 limbo limbo? 4096? 9\xe6\x9c\x88 10 15:27 c\ndrwxrwxr-x 3 limbo limbo? 4096? 9\xe6\x9c\x88 11 14:35 d3\ndrwxrwxr-x 3 limbo limbo? 4096? 9\xe6\x9n', None)

它會返回一個元組:(stdoutdata, stderrdata)

subprocess還有另一種更簡單方法,效果一樣,它會返回stdout

復制代碼 代碼如下:

>>> s = subprocess.check_output('ls -l', shell=True)
>>> s
'\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 152\n-rw------- 1 limbo limbo?? 808? 7\xe6\x9c\x88? 6 17:46 0000-00-00-welcome-to-jekyll.markdown.erb\ndrwx------ 2 limbo limbo? 4096? 8\xe6\x9c\x88 15 18:43 arg\ndrwx------ 2 limbo limbo? 4096? 8\xe6\x9c\x88? 7 17:37 argv\ndrwxrwxr-x 2 limbo limbo? 4096? 9\xe6\x9c\x88 10 15:27 c\ndrwxrwxr-x 3 limbo limbo? 4096? 9\xe6\x9c\x88 11 14:35 d3\ndrwxrwxr-x 3 limbo limbo? 4096? 9\xe6\x9n'

前者可以實現更多的交互,如stderr和stdin,但是在前面調用Popen的時候要實現定義Popen(stdin=subprocess.PIPE, stderr=subprocess)

給子進程輸入

復制代碼 代碼如下:

import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")

()不為空,則寫入subprocess.PIPE,為空,則從subprocess.PIPE讀取


subprocess.PIPE

復制代碼 代碼如下:

#!/usr/bin/env python
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out

實際上是這樣的過程

復制代碼 代碼如下:

child1.stdout-->subprocess.PIPE

child2.stdin<--subprocess.PIPE

child2.stdout-->subprocess.PIPE


要注意的是,communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成。

subprocess.PIPE實際上為文本流提供一個緩存區。直到communicate()方法從PIPE中讀取出PIPE中的文本.要注意的是,communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本精品久久久一区二区三区 | 日韩欧美一二区 | 欧美精品 日韩 | 一级全黄色毛片 | 欧美一级毛片国产一级毛片 | 国产高清福利91成人 | 欧美日韩亚洲国产精品一区二区 | 国内特级毛片 | 欧美一区二区三区视频在线观看 | 在线播放波多野结衣 | tobesex日本护士 | 伊人99热| 激情五月综合综合久久69 | 中文乱码字幕午夜无线观看 | a毛片在线 | 日本亚欧乱色视频在线网站 | 国产一区二区三区成人久久片 | 91尤物视频在线观看 | 99热这里精品 | 免费看一级毛片 | 国产五月色婷婷六月丁香视频 | 视频国产在线 | 亚洲精品色一区二区三区 | 国内精品久久久久久麻豆 | 日韩美女中文字幕 | 中文字幕免费在线观看 | 日韩欧美久久一区二区 | 青春草国产成人精品久久 | 快射视频在线观看 | 91亚洲精品一区二区在线观看 | 国产xxxx做受性欧美88 | 国产在线精彩视频二区 | 欧美啪 | 看免费5xxaaa毛片30厘米 | 五月婷婷激情综合网 | 国产成+人+亚洲+欧美综合 | 欧美一级毛片片aa视频 | 男女性高清爱潮视频免费观看 | 伦伦影院精品一区 | 亚洲成片观看四虎永久 | 日韩性网站|