subprocess
在Python中,提供了subprocess模块,通过这个模块中的相应API,
就可以开启一个子进程来执行相应的脚本来完成这个操作。
可以通过subprocess中的Popen类来处理这个命令。
即允许你去创建一个新的进程让其执行另外的程序,
并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
popen类
subprocess模块定义了一个Popen类,通过它可以创建进程,并与其进行复杂的交互。
__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 | 一般是一个字符串,是要执行的shell命令内容 |
bufsize | 设置缓冲,负数表示系统默认缓冲,0表示无缓冲,正数表示自定义缓冲行数 |
stdin | 程序的标准输入句柄,NONE表示不进行重定向,继承父进程,PIPE表示创建管道 |
stdout | 程序的标准输出句柄,参数意义同上 |
stderr | 程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致 |
shell | 为True时,表示将通过shell来执行 |
cwd | 用来设置当前子进程的目录 |
env | 设置环境变量,为NONE表示继承自父进程的 |
universal_newlines | 将此参数设置为True,Python统一把这些换行符当作’/n’来处理。 |
进程通信实例
在shell=True这个参数,不写的时候默认是False,shell默认为/bin/sh
。如果 args是一个字符串,则该字符串指定要通过shell执行的命令。这意味着字符串的格式必须与在shell提示符下键入时完全相同。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,任何其他项将被视为shell本身的附加参数。也就是说,Popen
相当于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
解决方法就是,当需要设置shell=True时(当False时,arges是列表,第一个参数是shell命令,后面的都是参数','
隔开),须把args设为string,空格隔开,如下:
# -*- coding: utf-8 -*-
import subprocess
# output = subprocess.Popen(["python", "/home/python/Desktop/z/my_subprocess/my_add.py"],
# stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = subprocess.Popen("python /home/python/Desktop/z/my_subprocess/my_add.py",
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output2 = subprocess.Popen("python /home/python/Desktop/z/my_subprocess/my_input.py",
stdin=output.stdout, stdout=subprocess.PIPE, shell=True)
output.stdout.close()
print 'output2:', output2
# print output2.stdout.read() # 会出现死锁
oc = output2.communicate()
print 'oc:', oc[0]
my_add.py
output的stdout只能输出在终端上的参数,如print,return不行
# def my_add():
# a = 5
# b = 6
# res = a+b
# return res
a = 5
b = 6
res = a+b
print res
my_input.py
把my_add.py的输出stdout放入my_input.py里当输入参数stdin
a = input()
c = a * a
print c
communicate()会避免由于输出参数过多造成死锁。返回的是一个tuple,(stdout,stderr)。
输出结果如下:
![12031442-8d1714120d7e5ef5.png](https://i-blog.csdnimg.cn/blog_migrate/878b2556c4cda4f7cd4585fef7af85b9.webp?x-image-process=image/format,png)
image.png