子进程getoutput不工作

subprocess getoutput not work

我正在研究类似 compile 的东西,我正在尝试编译汇编程序并使用 subprocess.

获取有关它的输出信息

当我使用 subprocess.call 时,一切正常,例如:

(我添加了一些垃圾邮件所以它会输出错误)

Version : Python3.5

In [12]: subprocess.call(['as','-32','test.s'])
test.s: Assembler messages:
test.s:3: Error: no such instruction: `zxvasdf'
Out[12]: 1

但是当我使用 subprocess.getoutput 时:

In [13]: subprocess.getoutput(['as','-32','test.s'])

它只是冻结,什么也不做。

我该如何解决这个问题?

感谢任何建议。

嗯,看来我可以用 subprocess.PIPE 来解决问题了。

In [16]: proc = subprocess.Popen(['as','-32','test.s'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

In [17]: for i in proc.stderr:
   ....:     print(i)
   ....:     
b'test.s: Assembler messages:\n'
b"test.s:3: Error: no such instruction: `zxvasdf'\n"

但是我不太明白为什么我会顺利。

我要查看文档了解更多详情。

谢谢大家。

subprocess.getouput() 不像 subprocess.call() 那样将列表作为输入。它采用单个参数作为字符串。将其更改为:

subprocess.getoutput('as -32 test.s')

的问题是 getoutput(cmd) 需要 shell 命令作为字符串。如果你传递一个列表;额外的参数被传递给 POSIX 上的 shell,而不是 'as' 进程本身。这意味着 'as' 程序是 运行 没有任何命令行参数。

It just freeze and do nothing .

似乎 as 在没有命令行参数的情况下调用等待它在标准输入上的输入。您可以开始输入一些汇编程序并按 Ctrl+D 指示 EOF。如果您不提供输入;它会永远挂起。

Why subprocess.Popen doesn't work when args is sequence?

如果你想从 'as' 子进程中读取 stdout 和 stderr;你可以使用 subprocess.run():

#!/usr/bin/env python3
import subprocess

p = subprocess.run(['as','-32','test.s'],
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE, # capture separately 
                   universal_newline=True) # decode bytes
print("Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=p))

注意:这里不要使用shell=True