我在使用subprocess.Popen.communicate()时遇到了一个奇怪的问题。作为后台,我想从我的python脚本中执行一个应用程序。当我从命令行运行程序时,我会这样做(UNIX):
$ echo "input text" | /path/to/myapp
从我的脚本中,我还想将输入管道化到应用程序中。所以,我尝试了以下几点。但是,当我尝试使用communicate()发送输入时,出现了“断管”错误:
>>> 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一无所知,这很难确定,但考虑一下
现在…:
因为…:
如果我们修复了这个错误:
…它能修复一切。如果省略stderr重定向,会发生什么情况——您可能看到来自myapp的任何错误消息。。。?
相关问题 更多 >
编程相关推荐