Pythonsubprocess模块解读.docx
- 文档编号:27148909
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:9
- 大小:59.38KB
Pythonsubprocess模块解读.docx
《Pythonsubprocess模块解读.docx》由会员分享,可在线阅读,更多相关《Pythonsubprocess模块解读.docx(9页珍藏版)》请在冰豆网上搜索。
Pythonsubprocess模块解读
Pythonsubprocess模块详细解读
本文研究的主要是Pythonsubprocess模块的相关内容,具体如下。
在学习这个模块前,我们先用Python的help()函数查看一下subprocess模块是干嘛的:
DESCRIPTION
Thismoduleallowsyoutospawnprocesses,connecttotheir
input/output/errorpipes,andobtaintheirreturncodes.
即允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
注意:
使用这个模块之前要先引入该模块。
Popen类
subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。
查看一下它的构造函数:
?
1
2
3
4
5
__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)
主要参数说明:
args:
argsshouldbeastring,orasequenceofprogramarguments.也就是说必须是一个字符串或者序列类型(如:
字符串、list、元组),用于指定进程的可执行文件及其参数。
如果是一个序列类型参数,则序列的第一个元素通常都必须是一个可执行文件的路径。
当然也可以使用executeable参数来指定可执行文件的路径。
stdin,stdout,stderr:
分别表示程序的标准输入、标准输出、标准错误。
有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。
shell:
如果这个参数被设置为True,程序将通过shell来执行。
env:
它描述的是子进程的环境变量。
如果为None,子进程的环境变量将从父进程继承而来。
创建Popen类的实例对象
?
1
res=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
cmd:
标准像子进程传入需要执行的shell命令,如:
ls-al
subprocess.PIPE:
在创建Popen对象时,subprocess.PIPE可以初始化为stdin,stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。
subprocess.STDOUT:
作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。
Popen类拥有的方法及属性
1、Popen.pid
获取子进程的进程ID。
2、Popen.returncode
获取进程的返回码。
如果进程未结束,将返回None。
3、communicate(input=None)
官方解释:
Interactwithprocess:
Senddatatostdin.Readdatafrom
stdoutandstderr,untilend-of-fileisreached.Waitfor
processtoterminate.Theoptionalinputargumentshouldbea
stringtobesenttothechildprocess,orNone,ifnodata
shouldbesenttothechild.
communicate()returnsatuple(stdout,stderr).
与子进程进行交互,像stdin发送数据,并从stdout和stderr读出数据存在一个tuple中并返回。
参数input应该是一个发送给子进程的字符串,如果未指定数据,将传入None。
4、poll()
检查子进程是否结束,并返回returncode属性。
5、wait()
?
1
Waitforchildprocesstoterminate.Returnsreturncodeattribute.
等待子进程执行结束,并返回returncode属性,如果为0表示执行成功。
6、send_signal(sig)
?
1
Sendasignaltotheprocess
发送信号给子进程。
7、terminate()
?
1
Terminatestheprocess
终止子进程。
windows下将调用WindowsAPITerminateProcess()来结束子进程。
8、kill()
官方文档对这个函数的解释跟terminate()是一样的,表示杀死子进程。
进程通信实例1
打开一个只有ip地址的文本文件,读取其中的ip,然后进行ping操作,并将ping结果写入ping.txt文件中。
首先创建一个子进程res,传入要执行的shell命令,并获得标准输出流、返回码等。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importsubprocess
importos
classShell(object):
defrunCmd(self,cmd):
res=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
sout,serr=municate()
returnres.returncode,sout,serr,res.pid
shell=Shell()
fp=open('c:
\\test\\ip.txt','r')
ipList=fp.readlines()
fp.close()
fp=open('c:
\\test\\ping.txt','a')
printipList
foriinipList:
i=i.strip()
result=shell.runCmd('ping'+i)
ifresult[0]==0:
w=i+':
0'
fp.write(w+'\n')
else:
w=i+':
1'
fp.write(w+'\n')
fp.close()
执行结果:
进程通信实例2
命令交互,不断从键盘接受命令执行,给出执行结果,直到用户输入exit或者bye退出命令交互。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
importsubprocess
classShell(object):
defrunCmd(self,cmd):
res=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
sout,serr=municate()
returnres.returncode,sout,serr,res.pid
shell=Shell()
while1:
input=raw_input('>')
ifinput=='exit'orinput=='bye':
break
else:
result=shell.runCmd(input)
print"返回码:
",result[0]
print"标准输出:
",result[1]
print"标准错误:
",result[2]
在Windows上也可以使用os.system()这个函数来执行一些dos命令,但是这个命令只能拿到返回码,拿不到标准输出,标准错误,所以通常使用的subprocess模块中的Popen类来实现。
Python中subprocess模块用法实例详解
更新时间:
2015年05月20日14:
35:
01 作者:
网海水手
我要评论
这篇文章主要介绍了Python中subprocess模块用法,实例分析了subprocess模块的相关使用技巧,需要的朋友可以参考下
本文实例讲述了Python中subprocess模块用法。
分享给大家供大家参考。
具体如下:
执行命令:
?
1
2
3
4
>>>subprocess.call(["ls","-l"])
0
>>>subprocess.call("exit1",shell=True)
1
测试调用系统中cmd命令,显示命令执行的结果:
?
1
2
3
x=subprocess.check_output(["echo","HelloWorld!
"],shell=True)
print(x)
"HelloWorld!
"
测试在python中显示文件内容:
?
1
2
3
4
5
y=subprocess.check_output(["type","app2.cpp"],shell=True)
print(y)
#include
usingnamespacestd;
......
查看ipconfig-all命令的输出,并将将输出保存到文件tmp.log中:
?
1
2
handle=open(r'd:
\tmp.log','wt')
subprocess.Popen(['ipconfig','-all'],stdout=handle)
查看网络设置ipconfig-all,保存到变量中:
?
1
2
3
4
5
6
output=subprocess.Popen(['ipconfig','-all'],stdout=subprocess.PIPE,shell=True)
oc=municate()#取出output中的字符串
#communicate()returnsatuple(stdoutdata,stderrdata).
print(oc[0])#打印网络信息
WindowsIPConfiguration
HostName.....
我们可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):
?
1
2
3
4
5
child1=subprocess.Popen(["dir","/w"],stdout=subprocess.PIPE,shell=True)
child2=subprocess.Popen(["wc"],stdin=child1.stdout,stdout=subprocess.PIPE,shell=True)
out=municate()
print(out)
(' 9 24 298\n',None)
如果想频繁地和子线程通信,那么不能使用communicate();因为communicate通信一次之后即关闭了管道.这时可以试试下面的方法:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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程序设计有所帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Pythonsubprocess 模块 解读
