当前位置: 首页 > 知识库问答 >
问题:

Pythonsubprocess.runstderr=子进程。PIPE重定向输入(文本)

欧阳楚
2023-03-14

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

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

使用python 3.6.2和windows 10

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

a=输入(“输入任何内容”)打印(“a有:“a)

  1. 打开cmd,键入:python
  2. 类型:导入子流程
  3. 类型:子流程。运行([“python”,“path..to..someProgram.py”],stderr=subprocess.PIPE)
  4. 目前没有输出,但解释器正在等待输入。。。输入一些东西,然后按回车键
  5. 您将看到print语句的输出

如果你删除,stderr=子进程。PIPE您将看到正确的输出。

现在,保存步骤2中的代码

我的问题是:

  1. 为什么子流程会出现此问题。跑步
  2. 我如何解决它
  3. 为什么通过命令行和IDE运行代码会有区别

共有1个答案

拓拔谭三
2023-03-14

输入函数打印提示文本到stderr,这是一个已知的问题

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

您可以自行输出提示,如:

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

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

python -c "import readline; import runpy; runpy.run_path('/path/to/program.py')"
 类似资料:
  • 问题内容: 我有一个UNIX本机可执行文件,它要求像这样输入参数 prog.exe <foo.txt。 foo.txt有两行:bar baz 我正在使用java.lang.ProcessBuilder来执行此命令。不幸的是,prog.exe仅能使用文件重定向功能。有什么办法可以模仿Java中的这种行为? 当然, 不起作用。 谢谢! 问题答案: 未经测试,但类似的东西应该起作用。

  • 问题内容: 我正在尝试使用Tkinter GUI启动子进程并将其stdout / stderr输出显示到Text小部件。最初,我认为可以通过设置“ sys.stdout = text_widget”轻松将sys.stdout重定向到Text小部件,但似乎不行。出现错误:“文本实例没有属性’flush’”。 我在线检查并得到了一些解决方案,例如使用队列与子进程进行通信。但是,由于我的特殊要求,它们都

  • 问题内容: 我想从Groovy程序中执行foo.bat,并将生成的进程的输出重定向到stdout。Java或Groovy代码示例都可以。 foo.bat可能需要花费几分钟才能运行并生成大量输出,因此我希望在生成后立即查看输出,而不是必须等到该过程完成之后才能立即查看所有输出。 问题答案: 它使用一个类读取执行的程序生成的所有输出,并将其显示在其自己的stdout中。

  • 问题内容: 我在命令行中执行的操作: 我想用python做什么: 问题答案: 更新:不鼓励使用,尽管在Python 3中仍然可用。 用途 如果你确实要使用子流程,请使用以下解决方案(大部分内容来自子流程的文档): OTOH,你可以完全避免系统调用:

  • 1. Shell 重定向 1.1 Shell 重定向是什么 我们在之前章节有学习 echo/printf 来将我们的需求输出,此时就是我们将系统的返回输出到我们标准终端,使得我们能够看到正常的输出的结果,Unix 命令默认的输入设备即 stdin 为键盘,标准和错误设备即 stdout 为显示器,我们利用重定向可以将输入改为文件,或者将输出重新定向到其他设备或文件中。 1.2 为什么要用重定向 我

  • 本文向大家介绍linux shell数据重定向(输入重定向与输出重定向)详细分析,包括了linux shell数据重定向(输入重定向与输出重定向)详细分析的使用技巧和注意事项,需要的朋友参考一下 在了解重定向之前,我们先来看看linux 的文件描述符。 linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操