【问题标题】:gevent's subprocess fails with OSError 22 (EINVAL)?gevent 的子进程因 OSError 22 (EINVAL) 而失败?
【发布时间】:2012-11-23 21:24:09
【问题描述】:

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

【问题讨论】:

  • 啊,这似乎解决了它。谢谢丹尼斯。

标签: python gevent


【解决方案1】:

查看1.0RC1 change log 似乎这是一个已修复的已知问题。升级到 1.0RC1 确实可以解决问题。

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 2011-04-29
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多