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(["ファイル", "foo.py"], stderr=STDOUT)
  ファイル ".../gevent/subprocess.py"、154 行目、check_output 内
    プロセス = Popen(stdout=PIPE, *popenargs, **kwargs)
  ファイル ".../gevent/subprocess.py"、231 行目、__init__ 内
    エラー、エラー書き込み)
  ファイル ".../gevent/subprocess.py"、714 行目、_execute_child 内
    データ = 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 に答える