我们能从Python官方文档里读到应该用subprocess
模块来运行系统命令.subprocess
模块允许我们创建子进程,连接他们的输入/输出/错误管道,还有获得返回值。
subprocess.Popen()
subprocess
模块中基本的进程创建和管理由Popen
类来处理.subprocess.popen
是用来替代os.popen
的.
我们来做一些真实的例子,subprocess.Popen
需要一个数组作为参数:
注意,虽然你可以使用 "shell=True",但并不推荐这样的方式.
如果你知道你只用几个有限的函数,比如Popen
和PIPE
,你可以单单指定这几个函数:
Popen.communicate()
communicate()
函数返回一个tuple
(标准输出和错误).Popen.communicate()
和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.
输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None
.
基本上,当你用 communicate()
函数的时候意味着你要执行命令了.
subprocess.check_output:
Python3中的subprocess.check_output函数可以执行一条sh命令,并返回命令的输出内容,用法如下:
output = subprocess.check_output(["python3", "xx.py"], shell = False)
该函数两个参数第一个表示命令内容,因为中间有空格所以用中括号这种形式,同时制定shell=False表示命令分开写了。而该命令执行后的输出内容会返回给output变量。
需要注意的是这个output变量并不是一个string,也就是说不能用string的一些函数,返回的其实是一个编码后的比特值,实际的编码格式取决于调用的命令,因此python3将解码过程交给应用层,也就是我们使用的人来做。这样就清晰了,要对输出使用stirng的操作,需要先通过解码将其转换成string:
output = subprocess.check_output(["python3", "xx.py"], shell = False)
out = output.decode()
if (out.find("yes") >= 0): print("yes")
else: print("no")