python3 subprocess使用,python subprocess执行多条命令
目录1。导言2。用法2.1 subprocess . call()2.2 subprocess . check _ call()2.3 subprocess . check _ output()2.4 subprocess . popen()3 .子流程的文本流控制
1.介绍一下Python从Python 2.4引入子进程模块管理子进程的方法来替代一些老的模块:比如os.system,os.spawn*,os.popen*,popen2。*、和命令。*外部命令不仅可以作为子进程调用,还可以连接到子进程的输入/输出/错误管道,以获取相关的返回信息。
2.子流程和常用封装函数的用法
运行python时,我们都在创建和运行一个流程。像Linux进程一样,一个进程可以派生一个子进程,让这个子进程执行另一个程序。在Python中,我们通过标准库中的子流程包派生一个子流程,并运行一个外部程序。
子流程包中定义了几个函数来创建子流程。这些函数以不同的方式创建子流程,因此我们可以根据需要选择一个来使用。此外,子进程还提供了一些管理标准流和管道的工具,以便在进程之间使用文本通信。
2.1 subprocess . call()的父流程等待子流程完成。
Returncode(相当于Linux退出代码)
2.2 subprocess . check _ call()的父流程等待子流程完成。
返回0
检查退出信息。如果returncode不为0,给出错误子流程。CalledProcessError该对象包含returncode属性,可以通过try…except…进行检查。
2.3 subprocess . check _ output()的父流程等待子流程完成。
将子流程的输出结果返回到标准输出。
检查退出信息。如果returncode不为0,给出错误子流程。该对象包含returncode属性和output属性。output属性是标准输出的输出结果,可以通过try…except…来检查。
这三个函数的用法相似。我们以subprocess.call()为例:
复制代码如下:
导入子流程
retcode=subprocess.call([ls ,-l])
#与shell中的命令ls -a的结果相同。
打印retcode
将0程序名和参数(-l)放在一个表中,并将其传递给subprocess.call()
默认情况下,Shell为False。在Linux下,当shell为false时,Popen调用os.execvp()执行args指定的程序;当Shell=True时,如果args是字符串,Popen直接调用系统Shell执行args指定的程序。如果args是一个序列,args的第一项是定义程序命令字符串,其他项是调用系统shell时的附加参数。
上面的例子也可以写成这样:
Code=subprocess.call (ls-l ,shell=true)在Windows下,不管shell的值是多少,Popen都会调用CreateProcess()来执行args指定的外部程序。如果args是序列,首先用list2cmdline()转换成字符串,但是需要注意的是,并不是所有MS Windows下的程序都可以用list2cmdline转换成命令行字符串。
2.4 subprocess . popen()的代码如下:
class Popen(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)实际上,以上函数都是基于Popen()的包装器。这些包的目的是让我们更容易使用子流程。当我们想要个性化我们的需求时,我们必须求助于Popen类,它生成对象来表示子流程。
与上面的封装不同,创建Popen对象后,主程序不会自动等待子进程完成。在父进程等待(即阻塞)之前,我们必须调用对象的wait()方法。例如:
导入子流程
子流程=子流程。Popen([ping ,-c , 4 , blog.linuxeye.com])
打印‘父进程’从运行结果可以看出,父进程在打开子进程后并没有等待子进程的完成,而是直接运行打印。
等待的情况:
导入子流程
子流程=子流程。popen( ping-C4 blog . Linux eye . com ,shell=True)
child.wait()
打印‘父进程’从运行结果可以看出,父进程启动子进程,等待子进程完成后再运行打印。
此外,您还可以对父流程中的子流程执行其他操作,例如上面示例中的子对象:
复制代码如下:
Child.poll() #检查子进程状态
Child.kill() #终止子进程
Child.send_signal() #向子进程发送信号
Child.terminate() #终止子进程的子进程的PID存储在child.pid中
3.子流程的文本流控制子流程的标准输入、标准输出和标准误差。分别表示以下属性:
儿童标准输入
child.stdout
Child.stderr可以改变Popen()建立子进程时的标准输入、标准输出和标准错误,可以使用子进程。管道连接多个子流程的输入和输出以形成一个管道,如以下两个示例所示:
复制代码如下:
导入子流程
child1=子流程。Popen([ls ,-l],stdout=子进程。管道)
print child1.stdout.read(),
#或child1.communicate()
导入子流程
child1=子流程。Popen([cat ,/etc/passwd],stdout=子进程。管道)
child2=子流程。Popen([grep , 0:0],stdin=child1.stdout,stdout=subprocess。管道)
out=child 2 . communicate()subprocess . pipe实际上为文本流提供了一个缓冲区。child1的stdout将文本输出到缓冲区,然后child2的stdin从管道中读取文本。child2的输出文本也存储在PIPE中,直到communicate()方法在PIPE中读出文本。
注意:communicate()是Popen对象的一个方法,它阻塞父进程,直到子进程完成。
参考资料:
马农游乐园
来自
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。