我的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 = []
答案 0 :(得分:0)
调用popen
时,在外部程序执行之前不会阻塞。对于dir_i
中的每个文件,将同时执行ocaml实例。操作系统只能同时处理一定数量的打开文件,因此您可能已达到此限制。
如果可能,您可以更改代码以等待每个popen
完成。也许通过使用子流程的wait
或call
方法。