Python子进程包返回折断的管道

乔兹蒂

我正在尝试做一个使用子流程包的非常简单的示例。python脚本应打开一个新进程并运行read命令。read命令应该通过PIPE接收来自stdin的输入。每当我尝试使用write()flush()它都会说:

Traceback (most recent call last):
  File "recorder.py", line 68, in <module>
    p.stdin.flush()
BrokenPipeError: [Errno 32] Broken pipe

我的python代码如下所示:

import subprocess
import time


p = subprocess.Popen(
    [
        "read",
    ],
    stdout=subprocess.PIPE,
    stdin=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    shell=True,
    bufsize=1
)

for character in "This is the message!\n":
    p.stdin.write(character.encode("utf-8"))
    time.sleep(0.25)
    p.stdin.flush()

assert p.returncode == 0

注意:一个字符接一个字符发送(睡眠超时)非常重要。

安德烈·K。

我实际上无法复制您的结果*,在我的情况下,您的循环运行了,并且assert由于p尚未完成并且没有returncode(或者它的值仍然None是那时)失败p.wait()在循环之后和assert强制之前插入我们仅在p终止后检查结果

现在,对于您所看到的异常,它很可能表明您要在其上执行的管道flush()已关闭。最有可能是由于该进程已经终止。也许在您的情况下,它也已经有一个(非零)returncode,这可以进一步帮助理解问题?**


*在我的系统上/bin/shsubprocess.Popen()with使用shell=True的实际上是bash运行["/bin/dash", "-c", "read"](大概是/bin/sh您系统上需要的shell),我也遇到了问题。


**像这样运行破折号似乎失败了:

/bin/dash: 1: read: arg count

并返回2

哪种问题更使人质疑:为什么/bin/dash -c "read"(from python调用失败。看来,破折号read(不像它的bash对应)总是期望至少一个变量名读入作为参数(替换readread foo)。


我猜这个python问题只是关于假设和Shell脚本可移植性的一课。:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章