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

标签 python subprocess conda stdout

我正在使用子进程生成 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/

相关文章:

python - 尝试从文本数据中提取数字,但 re.findall() 找不到任何内容

python check_output 文件未找到错误 : [WinError 2] The system cannot find the file specified

Python subprocess.check_output(args) 失败,而通过 Windows 命令行执行的 args 工作正常

python - 当 Flask 文件中的流式响应无法播放时

python - 官方 AnacondaRecipes/opencv-feedstock 的 conda-build 无法查找 libpng.h

Python - 子进程和 python shell

Python程序完成后不会退出

python - 在 django-tastypie 中获取经过身份验证的用户

python - 如何将软件包安装到由 conda 创建的特定 virtualenv 中

python-3.x - Visual Studio Code、Conda 和 Python 环境(我无法让它工作)