python當(dāng)中subprocess里call與Popen的用法區(qū)別
- 資格考試
- 2022-08-28 12:58:37
python subprocess怎樣才能 popen的進(jìn)程
在收集snmp數(shù)據(jù)的過程中用到了subprocess這個(gè)模塊,本來想用其他python里面關(guān)于snmp的庫,還是覺得麻煩就直接調(diào)用snmpwalk來收集數(shù)據(jù)。 最開始想用subprocess.call()這個(gè)函數(shù),然而這個(gè)函數(shù)沒有和其他進(jìn)程通信的功能就放棄了 google了一下找到subprocess.Popen()這個(gè)函數(shù),具體用法后面會(huì)貼一個(gè)別人寫的帖子 其中subprocess.PIPE類似于pipe()系統(tǒng)調(diào)用,不過不需要指定PID,只需要把stdout,stdin,error指定為subprocess.PIPE就可以了 我寫的這個(gè)小腳本里面有參數(shù)shell=True,意思是通過shepython的問題 subprocess.Popen
自從工作了就好久沒發(fā)博客,還是出來冒個(gè)泡=。= 前段時(shí)間寫的一個(gè)項(xiàng)目需要用python的subprocess.Popen大量調(diào)用某shell命令,運(yùn)行到一定量級(jí)之后就會(huì)產(chǎn)生內(nèi)存溢出,造成大量線程阻塞,然后就會(huì)造成([Errno 24] Too many open files)這個(gè)異常。 網(wǎng)上有人說是close_fds=True這個(gè)參數(shù)在python2.x默認(rèn)沒打開,這個(gè)參數(shù)可以關(guān)閉文件描述符,試了沒有作用。 后來在國外某個(gè)人的帖子找到了和我類似的問題,解決辦法就是執(zhí)行后把stdin,stdout,stderr3個(gè)流進(jìn)行清空即可。 結(jié)合網(wǎng)上的資料,寫了一個(gè)可以自定義超時(shí)時(shí)間調(diào)用subprocessubprocess python 怎么用
執(zhí)行命令:
>>>subprocess.call(["ls","-l"])
0
>>>subprocess.call("exit1",shell=True)
1
測(cè)試調(diào)用系統(tǒng)中cmd命令,顯示命令執(zhí)行的結(jié)果:
x=subprocess.check_output(["echo","HelloWorld!"],shell=True)
print(x)
"HelloWorld!"
測(cè)試在python中顯示文件內(nèi)容:
y=subprocess.check_output(["type","app2.cpp"],shell=True)
print(y)
#include
usingnamespacestd;
......
查看ipconfig -all命令的輸出,并將將輸出保存到文件tmp.log中:
handle=open(r'd:\tmp.log','wt')
subprocess.Popen(['ipconfig','-all'],stdout=handle)
查看網(wǎng)絡(luò)設(shè)置ipconfig -all,保存到變量中:
output=subprocess.Popen(['ipconfig','-all'],stdout=subprocess.PIPE,shell=True)
oc=output.communicate()#取出output中的字符串
#communicate()returnsatuple(stdoutdata,stderrdata).
print(oc[0])#打印網(wǎng)絡(luò)信息
WindowsIPConfiguration
HostName.....
我們可以在Popen()建立子進(jìn)程的時(shí)候改變標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,并可以利用subprocess.PIPE將多個(gè)子進(jìn)程的輸入和輸出連接在一起,構(gòu)成管道(pipe):
child1=subprocess.Popen(["dir","/w"],stdout=subprocess.PIPE,shell=True)
child2=subprocess.Popen(["wc"],stdin=child1.stdout,stdout=subprocess.PIPE,shell=True)
out=child2.communicate()
print(out)
('924298\n',None)
如果想頻繁地和子線程通信,那么不能使用communicate();因?yàn)閏ommunicate通信一次之后即關(guān)閉了管道.這時(shí)可以試試下面的方法:
p=subprocess.Popen(["wc"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
p.stdin.write('yourcommand')
p.stdin.flush()
#......dosomething
try:
#......dosomething
p.stdout.readline()
#......dosomething
except:
print('IOError')
#......dosomethingmore
p.stdin.write('yourothercommand')
p.stdin.flush()
#......dosomethingmore
Python fopen,open,和popen的區(qū)別
open標(biāo)準(zhǔn)posix接口,通用接口,不帶緩沖區(qū),效率和速度不錯(cuò),用close關(guān)閉。 fopen基于posix進(jìn)行封裝,在glibc中,有緩沖區(qū),效率也不錯(cuò),主要多文件進(jìn)行操作,用fclose關(guān)閉。 如:fopen(“/proc/partitions”, “r”)); popen為創(chuàng)建管道,內(nèi)部fork進(jìn)程執(zhí)行shell命令,效率堪憂,用pclose關(guān)閉。 如:popen(“cat /proc/partitions”, “r”));python在windows下subprocess模塊Popen的一個(gè)特別用法
def getmask(): command='for /f "delims=: tokens=2" %i in (\'ipconfig ^| findstr 子網(wǎng)掩碼\') do echo %i' Popen(command,shell=True)展開全文閱讀