子进程getoutput不起作用

时间:2016-05-14 02:18:44

标签: python subprocess

我正在开发类似于编译的东西,我正在尝试编译汇编程序并使用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'])

它只是冻结而什么都不做。

我该如何解决这个问题?

感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

@Lex Scarisbrick correctly noticed的问题是getoutput(cmd)期望shell命令为字符串。如果你把它传给一个清单;附加参数传递给POSIX上的shell,而不是'as'进程本身。这意味着'as'程序在没有任何命令行参数的情况下运行。

  

它只是冻结而什么都不做。

似乎在没有命令行参数的情况下调用as等待它在stdin上的输入。您可以开始键入一些汇编程序并按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

答案 1 :(得分:1)

subprocess.getouput()不会将列表视为subprocess.call()之类的输入。它将一个参数作为字符串。将其更改为:

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

答案 2 :(得分:0)

好吧,似乎我可以使用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"

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

我将查看该文档以获取更多详细信息。

谢谢大家。