例如,使用子进程:
import subprocess
x = subprocess.check_output(["echo","one","two","three"])
其中x将是输出(python3字节类:x.decode('utf-8')
转换为字符串)
请注意,这不会复制stderr。如果您还需要stderr,可以执行以下操作:
x = subprocess.check_output(["bash","-c", 'echo foo; echo bar >&2'],stderr=subprocess.STDOUT)
当然,还有许多其他捕获stderr的方法,包括将其保存到不同的输出变量中。
使用直接控制
然而,如果您正在进行一些棘手的操作并需要直接控制,则可以查看下面的代码:
import os
rside, wside = os.pipe()
if not os.fork():
os.close(rside)
os.dup2(wside, 1)
os.dup2(wside, 2)
devnull = os.open("/dev/null", os.O_RDONLY)
os.dup2(devnull, 0)
os.execve("/bin/bash",["/bin/bash","-c","echo stdout; echo stderr >&2"],os.environ)
print("Failed to exec program!")
sys.exit(1)
os.close(wside)
pyrside = os.fdopen(rside)
for line in pyrside:
print("Child (stdout or stderr) said: <%s>"%line)
pid, status = os.waitpid(-1, 0)
print("Child exited: pid %d returned %d"%(pid,status))
注意:
@初学者的回答存在一些缺陷:包括os._exit(0),这会立即导致子进程退出,使其他所有操作都变得无意义。没有os.execve(),使得问题的主要目标无法实现。没有方法可以访问子进程的stdout/stderr,这也是另一个问题的目标。