【问题标题】:No output from Python subprocessPython子进程没有输出
【发布时间】: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


【解决方案1】:

它没有打印到屏幕上,因为您将输出重定向到 PIPE。去掉管道参数,输出会正常stdout

您也可以使用subprocess.call

subprocess.call('echo hi', shell=True)

如果你想通过管道输出,你应该改用Popen

process = subprocess.Popen('echo hi', shell=True, stdout=subprocess.PIPE)
process.wait()
print process.stdout.read()

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

process.stdout.read().decode('utf-8')

【讨论】:

  • 当我删除管道参数并再次运行我的代码时,屏幕上没有任何输出。将您的脚本与 Popen 一起使用,我确实得到了输出。它是通过管道传输到哪里的?如果我删除管道参数,为什么它不打印到屏幕上?
  • 不,它没有。我也在使用 Python 3.5,我相信 subprocess.call 只是一个遗留功能,无论如何调用都会运行?
  • @David,在你说希望它输出到“Python Shell”的问题中。你指的是IDLE吗?如果是这样,您需要先将 pythonw.exe 附加到控制台。否则,Windows 会自动创建一个控制台,该控制台会在 cmd.exe 退出后立即销毁,因为没有其他进程连接到控制台。以下分配并附加到控制台:import ctypes; ctypes.WinDLL('kernel32').AllocConsole().
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多