用于用户输入的python子流程

2024-09-29 03:38:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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

用户_input.py:

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选项,我就可以输入。但是有了这些选项,我就不能向控制台写入任何输入了。 实际上,我需要这些选项来重定向标准输出,以便在父进程中访问打印的用户输入。 有人知道这里有什么问题吗


Tags: 用户pyimportinput选项stderrstdoutproc
1条回答
网友
1楼 · 发布于 2024-09-29 03:38:51

请注意,我不明白你为什么要这样做,并且本能地认为你不应该这样做。然而,这是完全可能的:只需catpure-onlystdout

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这对我来说很有效,但我不知道是否对你有效:

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。但是在这一点上,我们正处于非常可怕的黑客领域

一个更好的,但仍然很粗糙的解决方案,是重新表述这个问题。您希望生成一个终端,这显然是您可以做到的,并且用户可以正确地与其交互,然后您希望在生成代码中从该终端获得输出STDOUT不是此通信的正确通道。就我个人而言,我的代码结构如下:

在生成代码中:

  • 生成参数化脚本以在生成的终端中运行,并将其另存为临时文件
  • 生成运行生成脚本的子终端
  • 等待完成
  • 读取临时文件并获取数据
  • 删除临时脚本和临时输出文件

在生成的代码中:

  • 尽可能多地做(毕竟你有一个完整的python)
  • 将输出作为json转储到临时文件

这仍然是不容易的,但它只涉及产卵一个终端。请注意,我仍然不明白您为什么要这样做,但这至少应该起作用

相关问题 更多 >