国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python的subprocess模塊總結(jié)

2019-11-25 18:06:40
字體:
供稿:網(wǎng)友

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

subprocess的主類

復(fù)制代碼 代碼如下:

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,元組),用于指定進程的可執(zhí)行文件及其參數(shù)。如果是序列類型,第一個元素通常是可執(zhí)行文件的路徑。我們也可以顯式的使用executeable參數(shù)來指定可執(zhí)行文件的路徑。

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

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

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

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

6)、shell設(shè)為true,程序?qū)⑼ㄟ^shell來執(zhí)行。

7)、cwd用于設(shè)置子進程的當(dāng)前目錄

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

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

Popen方法

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

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

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

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

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

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

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

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

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

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

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

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

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

以上全是抄的

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

可以這樣寫

復(fù)制代碼 代碼如下:

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

也可以這樣

復(fù)制代碼 代碼如下:

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

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

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

程序返回運行結(jié)果

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

復(fù)制代碼 代碼如下:

>>> 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

復(fù)制代碼 代碼如下:

>>> 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'

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

給子進程輸入

復(fù)制代碼 代碼如下:

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

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


subprocess.PIPE

復(fù)制代碼 代碼如下:

#!/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

實際上是這樣的過程

復(fù)制代碼 代碼如下:

child1.stdout-->subprocess.PIPE

child2.stdin<--subprocess.PIPE

child2.stdout-->subprocess.PIPE


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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 专栏| 哈密市| 罗定市| 页游| 崇明县| 宁河县| 南城县| 元氏县| 贵港市| 萨嘎县| 永修县| 华安县| 桐乡市| 克东县| 沙洋县| 海阳市| 台前县| 抚远县| 怀仁县| 莱西市| 罗城| 余江县| 淳化县| 进贤县| 望谟县| 铜陵市| 辰溪县| 册亨县| 乌苏市| 阜宁县| 青州市| 伊金霍洛旗| 瑞安市| 汪清县| 通渭县| 射洪县| 建宁县| 兴宁市| 赤城县| 汤原县| 庆安县|