2017-10-08 28 views
1

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

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

使用Python 3.6.2和Windows 10

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

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

  1. 开放CMD,类型:蟒
  2. 类型:进口子
  3. 类型:subprocess.run([ “蟒”, “path..to..someProgram.py”],标准错误= subprocess.PIPE)
  4. 否ouptut到目前为止,解释器正在等待输入......键入内容并按Enter键。
  5. 您将看到print语句的输出。

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

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

我的问题是:

  1. 为什么这个问题subprocess.run发生
  2. 我怎样才能解决这个问题
  3. 为什么会有通过命令行,并通过IDE运行的代码之间的差异。

回答

1

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

您重定向stderr,因此提示文本没有显示,当你从LiClipse运行,标准错误不是重定向。

您可以输出提示你的自我,像:

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

另外,inputimport readline模块,然后input将使用GNU readline LIB(如果有),打印到标准输出。虽然在你的情况下,程序作为一个子进程运行,你仍然可以实现这一点:

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

感谢您指出错误报告。我正在使用Windows,所以我将不得不下载并使用pyreadline。您是否知道另一个与操作系统无关的解决方法? –

+0

或者,您可以自己打印提示标准输出,更新。 – georgexsh

+0

感谢georgexsh。不幸的是,这不符合我的要求。 –