0

将我的开发笔记本电脑升级到 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(来自自制软件)。

4

1 回答 1

0

查看1.0RC1 更改日志,这似乎是一个已修复的已知问题。升级到 1.0RC1 确实可以解决这个问题。

于 2012-12-09T02:18:36.857 回答