python子進程模塊subprocess詳解與應用實例 之三


二、應用實例解析

2.1 subprocess模塊的使用

1. subprocess.call

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

2. 調用系統中cmd命令,顯示命令執行的結果:

x=subprocess.check_output(["echo", "Hello World!"],shell=True)  
  
print(x)  
"Hello World!"  

3. 在python中顯示文件內容:

y=subprocess.check_output(["type", "app2.cpp"],shell=True)  
  
print(y)  
#include     
using namespace std;    
...... 

4. 查看ipconfig -all命令的輸出,並將將輸出保存到文件tmp.log中:

handle = open(r'd:\tmp.log','wt')  
subprocess.Popen(['ipconfig','-all'], stdout=handle) 

5. 查看網絡設置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 . . . . .  

6. 如果想頻繁地和子線程通信,那么不能使用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  

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

# 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  

參考:

http://blog.csdn.net/junshao90/article/details/8215751
http://blog.csdn.net/b_h_l/article/details/10080171

http://blog.csdn.net/marising/article/details/6551692

 

from:http://blog.chinaunix.net/uid-26000296-id-4461555.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM