我试图在Python(2.7)下使用subprocess32.Popen()打开多个子进程,每个子进程运行相同的预编译二进制文件,但操作的文件位于唯一目录中。大多数时候一切都很好,但我经常收到一个OSError[Errno 14]错误地址。代码如下:
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或{a2})
你知道我为什么会犯这个错误吗?
更重要的是:
我该怎么解决?
作为参考,我们使用subprocess32,它应该通过多个子进程调用提高稳定性。另外,如果相关的话,整个方案会被打包成一个更大的基于MPI的HPC并行调用,这样多个计算节点同时尝试执行相同的操作。由于担心在多次尝试执行同一文件时可能会出现冲突或文件系统问题,我们已经在执行之前将二进制文件复制到每个节点。在
另外,我在使用shell=False
时看到了相同的问题:
这似乎发生在Windows上。MacOS没有问题。在
我找到了一个老套但实际可行的解决方案:
我也遇到了同样的问题,但还是设法摆脱了。我发现只有当代码在集群中的不同节点上运行时才会出现问题。如果所有列组都在同一个节点中,则一切正常。所以,我在我的系统中尝试了:
shell=True
。有了这个问题并没有消失,但在我的高性能计算机上发生的几率要低得多。在pip
在其中安装所有必需的工具(mpi4py、NumPy等)。在我不知道这些步骤中哪一个是有用的,但这个问题现在似乎已经不存在了。在
这是python2.6上的一个错误,并在2.7中修复。在
由于读取系统调用从其中返回EINTR而引发IOError 方法(
read()
,readline()
,readlines()
)。在参见: https://github.com/python/cpython/commit/736ca00270db72fefa5fb278982c96e5e7139d72
以及
https://github.com/python/cpython/blob/2.6/Objects/fileobject.c#L1362。在
升级你的python然后一切都很有趣。在
相关问题 更多 >
编程相关推荐