Python subprocess模組

來源:互聯網
上載者:User

標籤:

subprocess模組提供進程間操作

call方法建立一個子進程

retcode=subprocess.call(["ls","-l","-a"])結果:-rw------- 1 root root     1570 Feb  3  2015 anaconda-ks.cfgdrwxr-xr-x 2 root root     4096 Feb  3  2015 Desktop-rw-r--r-- 1 root root    59038 Feb  3  2015 install.log-rw-r--r-- 1 root root     5266 Feb  3  2015 install.log.syslog-rw-r--r-- 1 root root   908984 May 18 12:29 nginx-1.9.15.tar.gz-rw-r--r-- 1 root root  2053336 May 18 18:12 pcre-8.38.tar.gz-rw-r--r-- 1 root root 18207283 May 18 18:13 php-7.0.6.tar.gz-rw-r--r-- 1 root root   148960 May 18 09:42 zabbix-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root   248051 May 18 09:41 zabbix-agent-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root    11296 May 18 09:33 zabbix-release-2.4-1.el6.noarch.rpm

在Linux下,shell=False時, Popen調用os.execvp()執行args指定的程式;shell=True時,如果args是字串,Popen直接調用系統的Shell來執行args指定的程式,如果args是一個序列,則args的第一項是定義程式命令字串,其它項是調用系統Shell時的附加參數。

>>> retcode=subprocess.call("ls -l",shell=True)total 21244-rw------- 1 root root     1570 Feb  3  2015 anaconda-ks.cfgdrwxr-xr-x 2 root root     4096 Feb  3  2015 Desktop-rw-r--r-- 1 root root    59038 Feb  3  2015 install.log-rw-r--r-- 1 root root     5266 Feb  3  2015 install.log.syslog-rw-r--r-- 1 root root   908984 May 18 12:29 nginx-1.9.15.tar.gz-rw-r--r-- 1 root root  2053336 May 18 18:12 pcre-8.38.tar.gz-rw-r--r-- 1 root root 18207283 May 18 18:13 php-7.0.6.tar.gz-rw-r--r-- 1 root root   148960 May 18 09:42 zabbix-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root   248051 May 18 09:41 zabbix-agent-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root    11296 May 18 09:33 zabbix-release-2.4-1.el6.noarch.rpm

實際上,上面的幾個函數都是基於Popen()的封裝(wrapper)。這些封裝的目的在於讓我們容易使用子進程。當我們想要更個人化我們的需求的時候,就要轉向Popen類,該類產生的對象用來代表子進程。

與上面的封裝不同,Popen對象建立後,主程式不會自動等待子進程完成。我們必須調用對象的wait()方法,父進程才會等待 (也就是阻塞block),舉例:


import subprocess
child = subprocess.Popen([‘ping‘,‘-n‘,‘4‘,‘blog.linuxeye.com‘])
# child.wait()
print (‘parent process‘)
結果:
從運行結果中看到,父進程在開啟子進程之後並沒有等待child的完成,而是直接運行print。
parent process

import subprocesschild = subprocess.Popen([‘ping‘,‘-n‘,‘4‘,‘blog.linuxeye.com‘])child.wait()print (‘parent process‘)
結果:(先等待子進程完成)正在 Ping blog.linuxeye.com [121.40.145.83] 具有 32 位元組的資料:來自 121.40.145.83 的回複: 位元組=32 時間=29ms TTL=52來自 121.40.145.83 的回複: 位元組=32 時間=33ms TTL=52來自 121.40.145.83 的回複: 位元組=32 時間=30ms TTL=52來自 121.40.145.83 的回複: 位元組=32 時間=32ms TTL=52121.40.145.83 的 Ping 統計資訊: 資料包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),往返行程的估計時間(以毫秒為單位): 最短 = 29ms,最長 = 33ms,平均 = 31msparent process

在父進程等待的時候,還可以對子進程做其他的操作

child.poll() # 檢查子進程狀態child.kill() # 終止子進程child.send_signal() # 向子進程發送訊號child.terminate() # 終止子進程

子進程的標準輸入、標準輸出和標準錯誤如下屬性分別表示:

child.stdinchild.stdoutchild.stderr

可以在Popen()建立子進程的時候改變標準輸入、標準輸出和標準錯誤,並可以利用subprocess.PIPE將多個子進程的輸入和輸出串連在一起,構成管道(pipe),如下2個例子:

把輸出放入到stdout中,然後從stdout中讀出來
>>> child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)>>> print child1.stdout.read()total 21244-rw------- 1 root root 1570 Feb 3 2015 anaconda-ks.cfgdrwxr-xr-x 2 root root 4096 Feb 3 2015 Desktop-rw-r--r-- 1 root root 59038 Feb 3 2015 install.log-rw-r--r-- 1 root root 5266 Feb 3 2015 install.log.syslog-rw-r--r-- 1 root root 908984 May 18 12:29 nginx-1.9.15.tar.gz-rw-r--r-- 1 root root 2053336 May 18 18:12 pcre-8.38.tar.gz-rw-r--r-- 1 root root 18207283 May 18 18:13 php-7.0.6.tar.gz-rw-r--r-- 1 root root 148960 May 18 09:42 zabbix-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root 248051 May 18 09:41 zabbix-agent-2.2.1-1.el5.x86_64.rpm-rw-r--r-- 1 root root 11296 May 18 09:33 zabbix-release-2.4-1.el6.noarch.rpm
>>> import subprocess>>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)>>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)>>> out = child2.communicate()>>> print out(‘root:x:0:0:root:/root:/bin/bash\n‘, None)


  >>> import subprocess
  >>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
  >>> child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
  >>> print child2.stdout.read
  <built-in method read of file object at 0x2b5838884be8>
  >>> print child2.stdout.read()
  root:x:0:0:root:/root:/bin/bash

 

Python subprocess模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.