Python

python使用subprocess

2018-10-10  本文已影响0人  Elvis_zhou

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)。
输出结果如下:


image.png
上一篇下一篇

猜你喜欢

热点阅读