python当中subprocess里call与Popen的用法区别
- 资格考试
- 2022-08-28 12:58:37
python subprocess怎样才能 popen的进程
在收集snmp数据的过程中用到了subprocess这个模块,本来想用其他python里面关于snmp的库,还是觉得麻烦就直接调用snmpwalk来收集数据。 最开始想用subprocess.call()这个函数,然而这个函数没有和其他进程通信的功能就放弃了 google了一下找到subprocess.Popen()这个函数,具体用法后面会贴一个别人写的帖子 其中subprocess.PIPE类似于pipe()系统调用,不过不需要指定PID,只需要把stdout,stdin,error指定为subprocess.PIPE就可以了 我写的这个小脚本里面有参数shell=True,意思是通过shepython的问题 subprocess.Popen
自从工作了就好久没发博客,还是出来冒个泡=。= 前段时间写的一个项目需要用python的subprocess.Popen大量调用某shell命令,运行到一定量级之后就会产生内存溢出,造成大量线程阻塞,然后就会造成([Errno 24] Too many open files)这个异常。 网上有人说是close_fds=True这个参数在python2.x默认没打开,这个参数可以关闭文件描述符,试了没有作用。 后来在国外某个人的帖子找到了和我类似的问题,解决办法就是执行后把stdin,stdout,stderr3个流进行清空即可。 结合网上的资料,写了一个可以自定义超时时间调用subprocessubprocess python 怎么用
执行命令:
>>>subprocess.call(["ls","-l"])
0
>>>subprocess.call("exit1",shell=True)
1
测试调用系统中cmd命令,显示命令执行的结果:
x=subprocess.check_output(["echo","HelloWorld!"],shell=True)
print(x)
"HelloWorld!"
测试在python中显示文件内容:
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)
查看网络设置ipconfig -all,保存到变量中:
output=subprocess.Popen(['ipconfig','-all'],stdout=subprocess.PIPE,shell=True)
oc=output.communicate()#取出output中的字符串
#communicate()returnsatuple(stdoutdata,stderrdata).
print(oc[0])#打印网络信息
WindowsIPConfiguration
HostName.....
我们可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(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();因为communicate通信一次之后即关闭了管道.这时可以试试下面的方法:
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的区别
open标准posix接口,通用接口,不带缓冲区,效率和速度不错,用close关闭。 fopen基于posix进行封装,在glibc中,有缓冲区,效率也不错,主要多文件进行操作,用fclose关闭。 如:fopen(“/proc/partitions”, “r”)); popen为创建管道,内部fork进程执行shell命令,效率堪忧,用pclose关闭。 如:popen(“cat /proc/partitions”, “r”));python在windows下subprocess模块Popen的一个特别用法
def getmask(): command='for /f "delims=: tokens=2" %i in (\'ipconfig ^| findstr 子网掩码\') do echo %i' Popen(command,shell=True)展开全文阅读