python-使用stdin从subprocess.Popen.communciate()断开管道
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-使用stdin从subprocess.Popen.communciate()断开管道,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2473字,纯文字阅读大概需要4分钟。
内容图文
![python-使用stdin从subprocess.Popen.communciate()断开管道](/upload/InfoBanner/zyjiaocheng/651/e79983adcc074470835c9573135f25cd.jpg)
使用subprocess.Popen.communicate()时遇到一个奇怪的问题.对于背景,我想从我的python脚本执行一个应用程序.当我从命令行运行该程序时,我会这样做(UNIX):
$echo "input text" | /path/to/myapp
从我的脚本中,我还想将输入传递到应用程序中.因此,我尝试了以下方法.但是,当我尝试使用communication()发送输入时,出现了“管道中断”错误:
>>> cmd = ['/path/to/myapp'] >>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) >>> out,err = p.communicate('input text') Traceback (most recent call last): File "", line 1, in File "/usr/lib/python2.5/subprocess.py", line 670, in communicate return self._communicate(input) File "/usr/lib/python2.5/subprocess.py", line 1223, in _communicate bytes_written = self._write_no_intr(self.stdin.fileno(), buffer(input, input_offset, 512)) File "/usr/lib/python2.5/subprocess.py", line 1003, in _write_no_intr return os.write(fd, s) OSError: [Errno 32] Broken pipe
更奇怪的是,如果我遗漏了输入数据,我不会得到任何错误.但是,这并不是一个很好的解决方法,因为应用程序需要输入才能工作.
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) >>> out,err = p.communicate() >>> print out [error from myapp regarding lack of input]
知道我缺少什么吗?
解决方法:
您的观察结果表明,myapp正在终止,而没有读取(所有)输入.对myapp一无所知,这很难确认,但是考虑一下
$echo 'hello world' | tr 'l' 'L'
heLLo worLd
现在…:
>>> cmd = ['/usr/bin/tr']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
>>> out,err = p.communicate('hello world')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/subprocess.py", line 668, in communicate
return self._communicate(input)
File "/usr/lib/python2.5/subprocess.py", line 1218, in _communicate
bytes_written = self._write_no_intr(self.stdin.fileno(), buffer(input, input_offset, 512))
File "/usr/lib/python2.5/subprocess.py", line 997, in _write_no_intr
return os.write(fd, s)
OSError: [Errno 32] Broken pipe
因为…:
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
>>> /usr/bin/tr: missing operand
Try `/usr/bin/tr --help' for more information.
如果我们修复了这个错误:
>>> cmd = ['/usr/bin/tr', 'l', 'L']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
>>> out,err = p.communicate('hello world')>>> print out
heLLo worLd
>>> print err
None
…修复所有问题.如果您省略stderr重定向,会发生什么?您可能会看到来自myapp的任何错误消息吗?
内容总结
以上是互联网集市为您收集整理的python-使用stdin从subprocess.Popen.communciate()断开管道全部内容,希望文章能够帮你解决python-使用stdin从subprocess.Popen.communciate()断开管道所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。