我可以让subprocess.call将调用的输出写入字符串吗?

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将包含该命令输出的字符串.


Fli*_*imm 6

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


Mun*_*med 5

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