我想从新终端的子进程中获取用户输入。
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:
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。有人知道这里有什么问题吗?
发布于 2021-10-04 11:01:59
请注意,我不明白你为什么要这样做,并本能地感到你不应该这样做。然而,这是完全可能的:仅仅是纯的标准输出
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不是此通信的适当通道。就我个人而言,我会像这样构造我的代码:
在产卵代码中:
completion
F 219
在生成的代码中:
这仍然是麻烦事,但它只涉及产卵一个终端。请注意,我仍然不明白您为什么要这样做,但这至少应该有效。
https://stackoverflow.com/questions/69434152
复制相似问题