gpt4 book ai didi

Python 子进程标准输出不捕获输入提示

转载 作者:行者123 更新时间:2023-12-04 09:18:58 25 4
gpt4 key购买 nike

我正在使用子进程生成 conda create 命令并捕获生成的 stdout 供以后使用。我还立即将 stdout 打印到控制台,这样用户仍然可以看到子进程的进度:

p = subprocess.Popen('conda create -n env1 python', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, b''):
sys.stdout.write(line.decode(sys.stdout.encoding))

conda create 需要用户输入时,这在执行到一半之前工作正常:它提示 Proceed (n/y)? 并等待用户输入一个选项。但是,上面的代码不会打印提示,而只是等待“在空白屏幕上”输入。收到输入后,之后会打印提示,然后按预期继续执行。

我假设这是因为输入以某种方式阻止了将提示写入 stdout,因此 readline 直到输入 block 被解除后才接收到新数据.

有没有办法确保在子进程等待用户输入之前打印输入提示?请注意,我在 Windows 上运行。

最佳答案

虽然我确信 pexpect 在这种情况下会奏效,但我认为它有点矫枉过正。相反,我使用了 MisterMiyagi 的见解并将 readline 替换为 read

最终代码如下:

p = subprocess.Popen('conda create -n env1 python', stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while p.poll() is None:
sys.stdout.write(p.stdout.read(1).decode(sys.stdout.encoding))
sys.stdout.flush()

请注意 read(1),因为仅使用 read() 会阻塞 while 循环,直到找到 EOF。如果在输入提示之前没有找到 EOF,则根本不会打印任何内容!此外,调用 flush 可确保写入 sys.stdout 的文本在屏幕上实际可见。

关于Python 子进程标准输出不捕获输入提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63129698/

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