私の開発用ラップトップを 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 (自作から)。