2016-04-04 13 views
2

複数のサブプロセスを開こうとしています - それぞれ同じプリコンパイル済みバイナリを実行していますが、 subprocess32.Popen()を使ってPython(2.7)の下で実行します。ほとんどの場合、正常に動作しますが、OSError [Errno 14] Bad Addressが頻繁に発生します。ここでは、コードは:Popen()でサブプロセスを確実に開くことができません - OSError [Errno 14] Bad Address

self.gld_stdout_file = open('stdout', 'w+') 
self.gld_stderr_file = open('stderr', 'w+') 
... 
subprocess.Popen(string.join(gld_open_str, " "), shell=True, stderr=self.gld_stderr_file, 
       stdout=self.gld_stdout_file, bufsize=-1, close_fds=ON_POSIX, 
       env={'TEMP':temp_path}) 

このエラーはpopenのを(使用する試みの約5~10%を生じる)、一方、他のpopenの()は、うまく同じループ作業のコール。周りを見渡すと、これは低レベルのソケット呼び出しのエラーから来ている可能性があり、直接インタフェースしていない可能性があります。 (例:Hereまたはhere

なぜこのエラーが発生するのですか?

そして、もっと重要なこと:私はそれを修正する方法を

参考のため、複数のサブプロセス呼び出しで安定性が向上しているsubprocess32を使用しています。また、関連する場合は、複数の計算ノードが同時に同じことを試みるように、スキーム全体がより大きなMPIベースのHPC並列呼び出しにラップされます。同じファイルを複数回実行しようとすると競合やファイルシステムの問題が発生する恐れがあるため、実行前にこれらのノードにバイナリをコピーしています。

はまた、私はのようにshell=Falseを使用して同じ問題を参照してください。

subprocess.Popen(gld_open_list, shell=False, stderr=self.gld_stderr_file, 
       stdout=self.gld_stdout_file, bufsize=-1, close_fds=ON_POSIX, 
       env={'TEMP':temp_path}) 

答えて

0

Windowsと発生するようです。 MacOSに問題はありません。

私はハックが、現実的な解決策を発見した:

while True: 
    try: 
     proc = subprocess.Popen(cmd, 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1) 
     (output,err)=proc.communicate() 
     break 
    except: 
     log_msg("Exception in spawning subprocess. Retrying ...") 
+0

私のテストはLinux(Red Hat Enterprise Server 6.3)で行われました –

1

バグだのpython2.6上を2.7に固定されました。

例外IOErrorこれら 方法(read()readline()readlines())内からEINTRを返すリードシステムコールによる上昇しました。

は、以下を参照してください。 https://github.com/python/cpython/commit/736ca00270db72fefa5fb278982c96e5e7139d72

https://github.com/python/cpython/blob/2.6/Objects/fileobject.c#L1362

あなたのpythonをアップグレードすると、すべて楽しいです。

+1

私のテストは2.7でしたが、それでも問題が発生しました。 –

関連する問題