Ale*_*lex 10 python subprocess
我想做subprocess.call,并将调用的输出变为字符串.我可以直接执行此操作,还是需要将其传输到文件中,然后从中读取?
换句话说,我可以以某种方式将stdout和stderr重定向到字符串中吗?
dsh*_*erd 12
这是mantazer对python3的回答的扩展。您仍然可以subprocess.check_output在python3中使用命令:
>>> subprocess.check_output(["echo", "hello world"])
b'hello world\n'
Run Code Online (Sandbox Code Playgroud)
但是现在它给了我们一个字节串。为了得到一个真实的python字符串,我们需要使用decode:
>>> subprocess.check_output(["echo", "hello world"]).decode(sys.stdout.encoding)
'hello world\n'
Run Code Online (Sandbox Code Playgroud)
使用sys.stdout.encoding编码而不是默认编码UTF-8可以使它在任何操作系统上都能正常工作(至少在理论上如此)。
尾随换行符(以及任何其他多余的空格)可以使用轻松删除.strip(),因此最终命令是:
>>> subprocess.check_output(["echo", "hello world"]
).decode(sys.stdout.encoding).strip()
'hello world'
Run Code Online (Sandbox Code Playgroud)
aet*_*ter 10
不,您无法将subprocess.call()的输出直接读入字符串.
为了将命令的输出读入字符串,您需要使用subprocess.Popen(),例如:
>>> cmd = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> cmd_out, cmd_err = cmd.communicate()
Run Code Online (Sandbox Code Playgroud)
cmd_out将包含该命令输出的字符串.
text=True在 Python 3.7+ 中使用在较新版本的 Python 中,您可以简单地使用text=True来获取字符串返回值:
>>> import subprocess
>>> subprocess.check_output(["echo", "hello"], text=True)
'hello\n'
Run Code Online (Sandbox Code Playgroud)
这是文档所说的:
如果指定了
encoding或,或者为 true,则使用指定的和/或默认值以文本模式打开 stdin、stdout 和 stderr 的文件对象。该参数等效于并且是为了向后兼容而提供的。默认情况下,文件对象以二进制模式打开。errorstextencodingerrorsio.TextIOWrapperuniversal_newlinestext
该subprocess模块提供了一个方法check_output(),该方法使用参数(如果有)运行提供的命令,并将其输出作为字节字符串返回.
output = subprocess.check_output(["echo", "hello world"])
print output
Run Code Online (Sandbox Code Playgroud)
上面的代码将打印出来 hello world
请参阅docs:https://docs.python.org/2/library/subprocess.html#subprocess.check_output