这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下subprocess.check_output
功能:
>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
该check_output
功能适用于仍在广泛使用的几乎所有版本的Python(2.7+)。2但对于较新的版本,不再推荐使用此方法。
如果你使用的是Python 3.5或更高版本,并且不需要向后兼容,则建议使用新run功能。它为该subprocess
模块提供了非常通用的高级API 。要捕获程序的输出,请将subprocess.PIPE
标志传递给stdout关键字参数。然后访问stdout返回CompletedProcess
对象的属性:
>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
返回值是一个bytes对象,因此,如果你需要正确的字符串,则需要decode它。假设被调用的进程返回一个UTF-8编码的字符串:
>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
所有这些都可以压缩为一种格式:
>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
如果要将输入传递给流程的stdin,bytes请将一个对象传递给input关键字参数:
>>> cmd = ['awk', 'length($0) > 5']
>>> input = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)
>>> result.stdout.decode('utf-8')
'foofoo\n'
你可以通过传递stderr=subprocess.PIPE
(捕获到result.stderr
)或stderr=subprocess.STDOUT
(捕获到result.stdout
常规输出)来捕获错误。如果不考虑安全性,你还可以shell=True
按照下面的说明通过传递来运行更复杂的Shell命令。
与旧的工作方式相比,这仅增加了一点复杂性。但是我认为值得这样做:现在,你仅需使用该run功能就可以完成几乎所有需要做的事情。