1. 程式人生 > >python子程序模組subprocess詳解與應用例項 之三

python子程序模組subprocess詳解與應用例項 之三

二、應用例項解析
2.1 subprocess模組的使用
1. subprocess.call

subprocess.call([“ls”, “-l”])
0
subprocess.call(“exit 1”, shell=True)
1

  1. 呼叫系統中cmd命令,顯示命令執行的結果:
    x=subprocess.check_output([“echo”, “Hello World!”],shell=True)

print(x)
“Hello World!”

  1. 在python中顯示檔案內容:
    y=subprocess.check_output([“type”, “app2.cpp”],shell=True)

print(y)

include

using namespace std;
……

  1. 檢視ipconfig -all命令的輸出,並將將輸出儲存到檔案tmp.log中:
    handle = open(r’d:\tmp.log’,’wt’)
    subprocess.Popen([‘ipconfig’,’-all’], stdout=handle)

  2. 檢視網路設定ipconfig -all,儲存到變數中
    output = subprocess.Popen([‘ipconfig’,’-all’], stdout=subprocess.PIPE,shell=True)
    oc=output.communicate() #取出output中的字串

communicate() returns a tuple (stdoutdata, stderrdata).

print(oc[0]) #列印網路資訊

Windows IP Configuration

    Host Name . . . . .  
  1. 如果想頻繁地和子執行緒通訊,那麼不能使用communicate();
    因為communicate通訊一次之後即關閉了管道.這時可以試試下面的方法:
    p= subprocess.Popen([“wc”], stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
    p.stdin.write(‘your command’)
    p.stdin.flush()

……do something

try:
#……do something
p.stdout.readline()
#……do something
except:
print(‘IOError’)

……do something more

p.stdin.write(‘your other command’)
p.stdin.flush()

……do something more

2.2 subprocess子程序和管道進行互動
其實在python中,和shell指令碼,其他程式互動的方式有很多,比如:
os.system(cmd),os.system只是執行一個shell命令,不能輸入、且無返回
os.open(cmd),可以互動,但是是一次性的,呼叫都少次都會建立和銷燬多少次程序,效能太差
1. 一個簡單的例子,呼叫ls命令,兩者之間是沒有互動的:
import subprocess
p = subprocess.Popen(‘ls’)
2. 在程式中獲取輸出的例子:
import subprocess
p = subprocess.Popen(‘ls’,stdout=subprocess.PIPE)
print p.stdout.readlines()
3. 有輸入,有輸出的例子,
父程序傳送’say hi’,子程序輸出 test say hi,父程序獲取輸出並列印

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

  1. 連續輸入和輸出的例子

test.py

import sys
while True:
line = sys.stdin.readline()
if not line:break
sys.stdout.write(line)
sys.stdout.flush()

run.py

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,要記得清空緩衝區,否則程式得不到正確的輸入和輸出

2.3 python 實時獲取子程序輸出
1. 方法一
import subprocess

def main():
process1 = subprocess.Popen(“python -u sub.py”, shell=False, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)

#print process1.communicate()[0]  

while True:  
    line = process1.stdout.readline()  
    if not line:  
        break  
    print line  

if name == ‘main‘:
main()
2. 方法二:
import subprocess
import time

p = subprocess.Popen(‘ping 127.0.0.1 -n 10’, stdout=subprocess.PIPE)
while p.poll() == None:
print p.stdout.readline()
time.sleep(1)
print p.stdout.read()
print ‘returen code:’, p.returncode