Python子进程没有输出

Dav*_*vid 1 python windows shell subprocess python-3.x

我使用的是 Python 3.5.1 和 Windows 10。我无法subprocess将输出显示在屏幕上。所以让我们从简单的事情开始:

import subprocess
process = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

当我运行我的 python 模块时,我希望它在 Python Shell 中打印“hi”。脚本运行并且不会返回错误,但它不会在屏幕上打印任何内容。

我也尝试了许多不同口味的subprocess(ie Popen),但仍然没有运气。我有一种感觉,这与我的 Windows/Python 环境的设置方式有关,但我真的不知道从哪里开始。想法?


更新

所以我现在明白我的原始代码示例不应该在屏幕上放置任何东西;然而,当我跑

import subprocess
p = subprocess.run('echo hi', shell=True)
Run Code Online (Sandbox Code Playgroud)

我没有输出。当我运行时:

import subprocess
p = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
print(p.stdout)
Run Code Online (Sandbox Code Playgroud)

我确实得到了输出。为什么第一个例子不起作用?

Bre*_*bel 5

它没有打印到屏幕上,因为您将输出重定向到PIPE. 删除管道参数,输出将正常stdout

您也可以使用subprocess.call

subprocess.call('echo hi', shell=True)
Run Code Online (Sandbox Code Playgroud)

如果要通过管道传输输出,则应Popen改用

process = subprocess.Popen('echo hi', shell=True, stdout=subprocess.PIPE)
process.wait()
print process.stdout.read()
Run Code Online (Sandbox Code Playgroud)

如果要将结果解码为 UTF-8 格式,只需添加 .decode('UTF-8')

process.stdout.read().decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

  • 当我删除管道参数并再次运行我的代码时,屏幕上没有任何输出。将您的脚本与 Popen 一起使用,我确实得到了输出。它被输送到哪里?如果我删除管道参数,为什么它不打印到屏幕上? (2认同)