Python subprocess popen [Errno 24]打开的文件过多

时间:2016-10-24 22:26:17

标签: python multithreading subprocess popen

我的python脚本调用外部命令来构建Ocaml项目,但是我遇到了打开太多文件的问题

  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之外,我没有打开任何文件。所以我很困惑为什么我得到这个例外。

更新

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 = []

1 个答案:

答案 0 :(得分:0)

调用popen时,在外部程序执行之前不会阻塞。对于dir_i中的每个文件,将同时执行ocaml实例。操作系统只能同时处理一定数量的打开文件,因此您可能已达到此限制。

如果可能,您可以更改代码以等待每个popen完成。也许通过使用子流程的waitcall方法。