子进程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
。
我正在研究类似 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
。