subprocess
在Python中躯嫉,提供了subprocess模塊燎含,通過這個模塊中的相應(yīng)API售睹,
就可以開啟一個子進(jìn)程來執(zhí)行相應(yīng)的腳本來完成這個操作。
可以通過subprocess中的Popen類來處理這個命令炒瘸。
即允許你去創(chuàng)建一個新的進(jìn)程讓其執(zhí)行另外的程序,
并與它進(jìn)行通信寝衫,獲取標(biāo)準(zhǔn)的輸入顷扩、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤以及返回碼等慰毅。
popen類
subprocess模塊定義了一個Popen類隘截,通過它可以創(chuàng)建進(jìn)程,并與其進(jìn)行復(fù)雜的交互。
__init__(self, 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)
下面是參數(shù)的意思:
參數(shù) | 作用 |
---|---|
args | 一般是一個字符串技俐,是要執(zhí)行的shell命令內(nèi)容 |
bufsize | 設(shè)置緩沖乘陪,負(fù)數(shù)表示系統(tǒng)默認(rèn)緩沖,0表示無緩沖雕擂,正數(shù)表示自定義緩沖行數(shù) |
stdin | 程序的標(biāo)準(zhǔn)輸入句柄啡邑,NONE表示不進(jìn)行重定向,繼承父進(jìn)程井赌,PIPE表示創(chuàng)建管道 |
stdout | 程序的標(biāo)準(zhǔn)輸出句柄谤逼,參數(shù)意義同上 |
stderr | 程序的標(biāo)準(zhǔn)錯誤句柄,參數(shù)意義同上仇穗,特殊流部,可以設(shè)置成STDOUT,表示與標(biāo)準(zhǔn)輸出一致 |
shell | 為True時纹坐,表示將通過shell來執(zhí)行 |
cwd | 用來設(shè)置當(dāng)前子進(jìn)程的目錄 |
env | 設(shè)置環(huán)境變量枝冀,為NONE表示繼承自父進(jìn)程的 |
universal_newlines | 將此參數(shù)設(shè)置為True,Python統(tǒng)一把這些換行符當(dāng)作’/n’來處理耘子。 |
進(jìn)程通信實(shí)例
在shell=True這個參數(shù)果漾,不寫的時候默認(rèn)是False,shell默認(rèn)為/bin/sh
谷誓。如果 args是一個字符串绒障,則該字符串指定要通過shell執(zhí)行的命令。這意味著字符串的格式必須與在shell提示符下鍵入時完全相同捍歪。這包括户辱,例如,引用或反斜杠轉(zhuǎn)義帶有空格的文件名糙臼。如果args是一個序列庐镐,則第一個項(xiàng)指定命令字符串,任何其他項(xiàng)將被視為shell本身的附加參數(shù)弓摘。也就是說焚鹊,Popen
相當(dāng)于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
解決方法就是,當(dāng)需要設(shè)置shell=True時(當(dāng)False時韧献,arges是列表末患,第一個參數(shù)是shell命令,后面的都是參數(shù)','
隔開)锤窑,須把a(bǔ)rgs設(shè)為string璧针,空格隔開,如下:
# -*- coding: utf-8 -*-
import subprocess
# output = subprocess.Popen(["python", "/home/python/Desktop/z/my_subprocess/my_add.py"],
# stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = subprocess.Popen("python /home/python/Desktop/z/my_subprocess/my_add.py",
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output2 = subprocess.Popen("python /home/python/Desktop/z/my_subprocess/my_input.py",
stdin=output.stdout, stdout=subprocess.PIPE, shell=True)
output.stdout.close()
print 'output2:', output2
# print output2.stdout.read() # 會出現(xiàn)死鎖
oc = output2.communicate()
print 'oc:', oc[0]
my_add.py
output的stdout只能輸出在終端上的參數(shù)渊啰,如print探橱,return不行
# def my_add():
# a = 5
# b = 6
# res = a+b
# return res
a = 5
b = 6
res = a+b
print res
my_input.py
把my_add.py的輸出stdout放入my_input.py里當(dāng)輸入?yún)?shù)stdin
a = input()
c = a * a
print c
communicate()會避免由于輸出參數(shù)過多造成死鎖申屹。返回的是一個tuple,(stdout,stderr)隧膏。
輸出結(jié)果如下:
image.png