带有stderr = subprocess.PIPE的Python subprocess.run重定向输入(文本)

时间:2017-10-08 22:46:06

标签: python subprocess liclipse

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

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

使用python 3.6.2和windows 10

  1. 创建一个包含以下两行的python程序,并将其保存为someProgram.py:
  2. a = input("Enter anything") print("a has: " + a)

    1. 打开cmd,输入:python
    2. type:import subprocess
    3. type:subprocess.run([“python”,“path..to..someProgram.py”],stderr = subprocess.PIPE)
    4. 到目前为止没有ouptut,但解释器正在等待输入...输入内容并按Enter键。
    5. 您将看到print语句的输出。
    6. 如果删除,stderr = subprocess.PIPE您将看到正确的输出。

      现在,保存第2步和第2步的代码。 3在另一个文件中,在someProgram.py所在的文件夹中将其命名为myProg.py。从LiClipse运行myProg.py。你会发现myProg.py运行正常并产生正确的输出。

      我的问题是:

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

1 个答案:

答案 0 :(得分:1)

input功能打印prompt text to stderr,这是known issue

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

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

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

或者,在import readline之前input模块,然后input将使用GNU readline lib(如果有),它将打印到stdout。在您的情况下,程序作为子进程运行,您仍然可以实现此目的:

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