【发布时间】:2016-11-19 01:03:48
【问题描述】:
我正在使用 Python 3.5.1 和 Windows 10。我无法让 subprocess 将输出放到屏幕上。所以让我们从简单的开始:
import subprocess
process = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
当我运行我的 python 模块时,我希望它在 Python Shell 中打印“hi”。脚本运行并且不返回错误,但它不会在屏幕上打印任何内容。
我也尝试了许多不同口味的subprocess(即Popen),但仍然没有运气。我感觉这与我的 Windows/Python 环境的设置方式有关,但我真的不知道从哪里开始。想法?
更新
所以我现在明白我的原始代码示例不应该在屏幕上显示任何内容;但是,当我跑步时
import subprocess
p = subprocess.run('echo hi', shell=True)
我没有输出。当我跑步时:
import subprocess
p = subprocess.run('echo hi', shell=True, stdout=subprocess.PIPE)
print(p.stdout)
我确实得到了输出。为什么第一个示例不起作用?
【问题讨论】:
-
输出没有显示在屏幕上的原因是您告诉
subprocess将标准输出路由到管道而不是屏幕。 -
那我可能不懂管道。根据文档, subprocess.pipe 是一个“特殊值,可用作 Popen 的标准输入、标准输出或标准错误参数,并指示应打开标准流的管道。”那么输出到哪里呢?
-
@David 使用
PIPE的目的是让您可以通过python file-like 对象与进程进行通信,并且还可以为不同的进程使用不同的管道。例如,为了防止多个进程同时写入标准输出。管道是在子进程对象的.stdin、.stdout和.stderr属性上创建的 -
那么当我在没有管道参数的情况下运行进程时,输出会转到正常的标准输出吗?哪个显然不是我设置中的屏幕?
-
stdout是(在 Windows 上)文件句柄。在控制台进程中,它“指向”控制台,就像不同的文件句柄可能“指向”常规文件一样。默认情况下,当您从 Windows 控制台创建新进程时,stdout会复制到新进程中。控制台也由新进程共享。这两个动作都可以被覆盖。无需涉及外壳!在 Windows 上,控制台不需要 shell。python.exe是一个控制台程序,它取决于它是如何启动的,使用哪个控制台。
标签: python windows shell python-3.x subprocess