无法可靠地打开Popen()OSError[Errno 14]地址错误的子进程

2024-06-01 00:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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时看到了相同的问题:

^{pr2}$

Tags: 文件self目录节点进程错误stderrstdout
3条回答

这似乎发生在Windows上。MacOS没有问题。在

我找到了一个老套但实际可行的解决方案:

while True:
    try:
        proc = subprocess.Popen(cmd, 
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1)
        (output,err)=proc.communicate()
        break
    except:
        log_msg("Exception in spawning subprocess. Retrying ...") 

我也遇到了同样的问题,但还是设法摆脱了。我发现只有当代码在集群中的不同节点上运行时才会出现问题。如果所有列组都在同一个节点中,则一切正常。所以,我在我的系统中尝试了:

  • 在Popen中使用shell=True。有了这个问题并没有消失,但在我的高性能计算机上发生的几率要低得多。在
  • 别用水蟒了。我从那里开始使用mpi4py和Python。在
  • 使用Open MPI 4.0.1。我以前用的是版本3。在
  • 生成一个Python virtual environment,并使用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然后一切都很有趣。在

相关问题 更多 >