我正在尝试做一个使用子流程包的非常简单的示例。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
注意:一个字符接一个字符发送(睡眠超时)非常重要。
我实际上无法复制您的结果*,在我的情况下,您的循环运行了,并且assert
由于p
尚未完成并且没有returncode
(或者它的值仍然None
是那时)而失败。p.wait()
在循环之后和assert
强制之前插入,我们仅在p
终止后检查结果。
现在,对于您所看到的异常,它很可能表明您要在其上执行的管道flush()
已关闭。最有可能是由于该进程已经终止。也许在您的情况下,它也已经有一个(非零)returncode
,这可以进一步帮助理解问题?**
*在我的系统上/bin/sh
,subprocess.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对应)总是期望至少一个变量名读入作为参数(替换read
用read foo
)。
我猜这个python问题只是关于假设和Shell脚本可移植性的一课。:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句