2016-10-24 2 views
1

Мой питон сумы вызывает внешнюю команду, чтобы построить проект OCaml, но я бегу в эту проблему слишком много файлов открыто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) 

file_i является входным генерироваться по

for file in os.listdir(dir_i): 

и devnull от

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

Когда я печатаю ошибку было бы Дис игры

[Errno 24] Too many open files 

У меня нет файлов, открытых кроме devnull. Поэтому я смущен, почему я получаю это исключение.

Update

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! = Исключение' должно быть' 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

Смежные вопросы