首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于用户输入的python子进程

用于用户输入的python子进程
EN

Stack Overflow用户
提问于 2021-10-04 10:04:30
回答 1查看 424关注 0票数 0

我想从新终端的子进程中获取用户输入。

代码语言:javascript
运行
复制
    import subprocess
    additionalBuildArguments = "defaultarg1"
    proc = subprocess.Popen(["python", "user_input.py", additionalBuildArguments],
                            creationflags=subprocess.CREATE_NEW_CONSOLE,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    try:
        outs, errs = proc.communicate(timeout=15)
    except subprocess.TimeoutExpired:
        proc.kill()
        outs, errs = proc.communicate()
    additionalBuildArguments = outs or additionalBuildArguments

user_input.py:

代码语言:javascript
运行
复制
import sys

arg = sys.argv[1]
user_input = input(f"Additional build arguments [{arg}] (Push <ENTER> to use these settings):\n")
print(user_input)

只要不设置stdout=subprocess.PIPE和/或stderr=subprocess.PIPE选项,就可以输入输入。但是使用这些选项,我不能将任何输入写入控制台。实际上,我需要这些选项来重定向标准输出,以访问父进程中打印的user_input。有人知道这里有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-10-04 11:01:59

请注意,我不明白你为什么要这样做,并本能地感到你不应该这样做。然而,这是完全可能的:仅仅是纯的标准输出

代码语言:javascript
运行
复制
import sys
from subprocess import run
print("Type away: ", end="")
sys.stdout.flush()
r = run(["python", "-c", "print(input())"], capture_output=True, encoding="utf8")
print(f"You entered {r.stdout}")

编辑显然是在使用windows。当设置shell=True时,根据文档设置您的标志。对于shell=True,这对我有用,但我不知道它是否适用于您:

代码语言:javascript
运行
复制
import sys
from subprocess import run
print("Type away: ", end="")
sys.stdout.flush()
r = run("python -c 'print(input())'", capture_output=True, shell=True, encoding="utf8")
print(f"You entered {r.stdout}")

这可以链接到运行在第三个进程,这将需要打印,同时也捕获标准,从一个子进程。但在这一点上,我们是在领域,非常可怕的黑客

一个更好的,但仍然是棘手的解决办法,是重新表述这个问题。您想要生成一个终端,这显然是您可以做到的,并且用户可以正确地与它交互,然后您希望在生成代码中从该终端获得输出。STDOUT不是此通信的适当通道。就我个人而言,我会像这样构造我的代码:

在产卵代码中:

completion

  • read

  • 生成参数化脚本以在派生终端中运行,并将其保存为临时文件

  • 生成的子终端,运行生成的脚本

  • ,等待

  • 临时输出文件,并获得数据

  • ,同时删除临时脚本和临时文件

F 219

在生成的代码中:

  • 尽可能多地执行(毕竟,您有一个完整的python )
  • 转储输出就像json到临时文件

这仍然是麻烦事,但它只涉及产卵一个终端。请注意,我仍然不明白您为什么要这样做,但这至少应该有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69434152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档