子进程:意外的关键字参数 capture_output
Posted
技术标签:
【中文标题】子进程:意外的关键字参数 capture_output【英文标题】:subprocess: unexpected keyword argument capture_output 【发布时间】:2019-04-12 01:02:36 【问题描述】:在执行Python docs 中给出的subprocess.run()
时,我得到一个TypeError:
>>> import subprocess
>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.6/subprocess.py", line 403, in run
with Popen(*popenargs, **kwargs) as process:
TypeError: __init__() got an unexpected keyword argument 'capture_output'
我正在运行 Python 3.6.6:
$ python3 --version
Python 3.6.6
【问题讨论】:
capture_output
是 Python 3.7 中的新功能。
【参考方案1】:
你检查了错误的文档,对于python-3.6,这个参数确实不存在,可以在documentation中找到(你选择左上角的版本):
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, env=None)
但是,您可以通过将 stdout
和 stderr
都设置为 PIPE
来轻松“模拟”它:
from subprocess import PIPE
subprocess.run(["ls", "-l", "/dev/null"], stdout=PIPE, stderr=PIPE)
其实,如果我们查看python-3.7版本的源码,我们在source code [GitHub]中看到了引入该功能的地方:
if capture_output: if ('stdout' in kwargs) or ('stderr' in kwargs): raise ValueError('stdout and stderr arguments may not be used ' 'with capture_output.') kwargs['stdout'] = PIPE kwargs['stderr'] = PIPE
【讨论】:
如果我尝试使用此处提供的解决方案,我会收到“名称 'PIPE' 未定义”。 @ScottF:你确实导入了它from subprocess import PIPE
(正如你在代码片段顶部看到的那样)?
你也可以使用stdout=subprocess.PIPE
来达到同样的效果而不需要导入【参考方案2】:
我遇到了这个错误,因为我调用的是 subprocess.call
(这是旧的高级 API)而不是 subprocess.run
。
【讨论】:
【参考方案3】:最简单的方法是使用subprocess.check_output函数:
import subprocess
subprocess.check_output(["ls", "-l", "/dev/null"])
【讨论】:
以上是关于子进程:意外的关键字参数 capture_output的主要内容,如果未能解决你的问题,请参考以下文章
尝试在python子进程中运行rsync时出现意外的远程arg错误
如何修复'translate()得到一个意外的关键字参数'格式''
Scikit 管道参数 - fit() 得到了一个意外的关键字参数“gamma”