将我的开发笔记本电脑升级到 Mountain Lion 后,我注意到gevent.subprocess.Popen
失败了……有时。
我有一个功能:
from gevent.subprocess import check_output
def do_stuff():
result = check_output(["file", "foo.py"], stderr=STDOUT)
它在下面的回溯中失败了:
回溯(最近一次通话最后): ... 文件“myfile.py”,第 105 行,在 do_stuff 中 结果 = check_output(["file", "foo.py"], stderr=STDOUT) 文件“.../gevent/subprocess.py”,第 154 行,在 check_output 进程 = Popen(stdout=PIPE, *popenargs, **kwargs) __init__ 中的文件“.../gevent/subprocess.py”,第 231 行 读错,写错) _execute_child 中的文件“.../gevent/subprocess.py”,第 714 行 数据 = errpipe_read.read(1048576) 文件“...ython2.7/socket.py”,第 380 行,正在读取 数据 = self._sock.recv(左) 文件“.../gevent/fileobject.py”,第 114 行,在 recv 数据 = os.read(self.fileno(), 大小) OSError:[Errno 22] 参数无效
但是,我尝试重新创建错误:
from gevent import monkey; monkey.patch_all()
import os
import gevent
from gevent.subprocess import check_output, STDOUT
def stuff(x):
f = x and "/dev/asdf" or "/dev/null"
print check_output(["file", f], stderr=STDOUT).strip()
while True:
pid = gevent.fork()
if pid == 0:
gevent.joinall([
gevent.spawn(stuff, x % 2)
for x in range(10)
])
else:
os.waitpid(-1, 0)
gevent.sleep(1)
失败了。上述程序运行没有问题。
这是怎么回事?或者,至少,关于我如何开始调试它的任何指针?
版本:gevent 1.0b3、Python 2.7.2、OS X 10.8.2、libev 4.11(来自自制软件)。