2016-10-24 9 views
1

私のpythonスクリップは、OCamlのプロジェクトをビルドするために外部コマンドを呼び出しますが、私はあまりにも多くのファイルのこの問題に実行していますがfile_iが生成され、入力されPythonのサブプロセスのpopen [ERRNO 24]開いているファイルが多すぎます

try: 
    handle = subprocess.Popen(['ocamlc', file_i], \ 
           stdout=subprocess.PIPE, \ 
           stderr=devnull, \ 
           cwd=dir_o, \ 
           close_fds=True 
          ) 
    except Exception as e: 
    handle = e 
    print(e) 

を開設しました

devnull = open(os.devnull, 'w') 

から

for file in os.listdir(dir_i): 

とdevnullされることによって、私はエラーを印刷するとき、それはDISだろう再生

[Errno 24] Too many open files 

devnull以外のファイルは開かれていません。だから私はなぜこの例外が出るのか混乱している。

更新

104  # process_count += 1 
105  # if process_count == MAX_PROCESS: 

107  # for p in processes: 
108  #  if p != Exception: 
109  #   p.wait() 
110  # process_count = 0 
111  # p = [] 
+0

'p!= Exception'は' not isinstance(p、Exception) 'でなければなりません。 –

答えて

0

popenを呼び出す場合、外部プログラムが実行されるまで、それはブロックされません。 ocamlインスタンスは、各ファイルに対して同じ時刻にdir_iに実行されます。オペレーティングシステムは、同時に開いているファイルの一定量しか処理できないため、おそらくこの制限に達しています。

可能であれば、popenが完了するまで待つようにコードを変更することができます。おそらく、サブプロセスのwaitまたはcallメソッドを使用します。

+0

@ j-p-petersen、私はp.wait()を使ってみましたが、私のプログラムはまだfdを実行しています。私の更新された投稿を見てください – Sugihara

+0

MAX_PROCESSの大きさは? –

+0

私はUbuntu 16.04で動作する仮想マシンを使用しています。私は500,250,100、および50を試しました – Sugihara

関連する問題