我正在开发类似于编译的东西,我正在尝试编译汇编程序并使用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'])
它只是冻结而什么都不做。
我该如何解决这个问题?
感谢您的任何建议。
答案 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"
但我不太明白为什么我顺利。
我将查看该文档以获取更多详细信息。
谢谢大家。