gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:36 29 4
gpt4 key购买 nike

我编写了一个程序(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("输入任何内容")
print("a 有: "+ 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 运行代码会有所不同。

最佳答案

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

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

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

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

或者,在input之前导入readline模块,然后input将使用GNU readline lib(如果你有),打印到标准输出。虽然在您的情况下,程序作为子进程运行,但您仍然可以实现此目的:

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

关于Python subprocess.run 与 stderr=subprocess.PIPE 重定向输入(文本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636813/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com