【问题标题】:Python subprocess.run with stderr=subprocess.PIPE redirects input(text)Python subprocess.run 与 stderr=subprocess.PIPE 重定向输入(文本)
【发布时间】:2018-03-20 02:15:54
【问题描述】:

我编写了一个程序(myProg.py),它使用 subprocess 模块通过 run 函数运行其他 python 程序。我注意到这些其他 python 程序中 input(arg) 语句中的 arg 没有显示到控制台(stdout),而 print(args) 中的 args 显示正确。这只发生在我通过控制台运行程序时。当我通过 LiClipse 运行程序时,不会发生这种情况。

这是复制这种情况的最简单方法:

使用 python 3.6.2 和 windows 10

  1. 创建一个包含以下两行的python程序并将其保存为someProgram.py:

a = input("Enter anything") print("a has: " + a)

  1. 打开cmd,输入:python
  2. 类型:导入子流程
  3. 类型:subprocess.run(["python", "path..to..someProgram.py"], stderr=subprocess.PIPE)
  4. 目前没有输出,但解释器正在等待输入...输入内容并按 Enter。
  5. 您将看到 print 语句的输出。

如果您删除 , stderr=subprocess.PIPE 您将看到正确的输出。

现在,将步骤 2 和 3 中的代码保存在另一个文件中,将其命名为 myProg.py,与 someProgram.py 位于同一文件夹中。从 LiClipse 运行 myProg.py。您会发现 myProg.py 运行良好并产生正确的输出。

我的问题是:

  1. 为什么 subprocess.run 会出现这个问题
  2. 我该如何解决
  3. 为什么通过命令行和通过 IDE 运行代码会有所不同。

【问题讨论】:

    标签: python subprocess liclipse


    【解决方案1】:

    input函数打印prompt text to stderr,这是一个known issue

    您重定向了stderr,因此未显示提示文本,当您从 LiClipse 运行时,stderr 不会被重定向。

    你可以自己输出提示,比如:

    print("Enter anything", end='')
    a = input()
    

    或者,input 之前的import readline 模块,然后input 将使用GNU readline 库(如果有),它会打印到标准输出。虽然在您的情况下,程序作为子进程运行,但您仍然可以实现这一点:

    python -c "import readline; import runpy; runpy.run_path('/path/to/program.py')"
    

    【讨论】:

    • 感谢您指出错误报告。我使用的是 Windows,所以我将不得不下载并使用 pyreadline。您是否知道另一种独立于操作系统的解决方法?
    • 或者,您可以自己打印提示到标准输出,更新。
    • 感谢 georgexsh。不幸的是,这不符合我的要求。
    • 我的程序运行其他人的程序。这些程序的代码中有 input("..") 调用,我不应该更改他们的代码。
    • 如果你可以安装 readline lib,这可能很有用python -c "import readline; import runpy; runpy.run_path('/path/to/file.py')"
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2020-03-15
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多