1

我编写了一个程序(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 中的代码保存在另一个文件中,在与 someProgram.py 相同的文件夹中将其命名为 myProg.py。从 LiClipse 运行 myProg.py。您会发现 myProg.py 运行良好并产生正确的输出。

我的问题是:

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

1 回答 1

1

input功能打印提示文本到stderr,这是一个已知问题

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

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

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

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

python -c "import readline; import runpy; runpy.run_path('/path/to/program.py')"
于 2017-10-10T15:43:48.657 回答