当管道太大时,Python的子进程模块会挂起

时间:2016-08-09 15:48:23

标签: python linux pipe subprocess popen

此命令导致RedHat linux中的Python 3.5无限期挂起:

import shapely.geometry

按下Ctrl + C后,我在" /lib/python3.5/ctypes/util.py"中跟踪了这段代码。它挂在subprocess.Popen部分:

try:
    with subprocess.Popen(['/sbin/ldconfig', '-p'],
                          stdin=subprocess.DEVNULL,
                          stderr=subprocess.DEVNULL,
                          stdout=subprocess.PIPE,
                          env={'LC_ALL': 'C', 'LANG': 'C'}) as p:
        res = re.search(regex, p.stdout.read())
        if res:
            return os.fsdecode(res.group(1))
except OSError:
            pass 

阅读this article后,我跑了这个:

$ldconfig -p 

我确实得到了一个大的列表,我认为是溢出管道,导致python挂起。

我的问题是:解决此问题的正确方法是什么?现在我做了一个util.py的猴子补丁来快速解决,但它没有解决根本原因。

try:
    raise(OSError) # I added this to avoid the stuff below from hanging!
    with subprocess.Popen(['/sbin/ldconfig', '-p'],
                          stdin=subprocess.DEVNULL,
                          stderr=subprocess.DEVNULL,
                          stdout=subprocess.PIPE,
                          env={'LC_ALL': 'C', 'LANG': 'C'}) as p:
        res = re.search(regex, p.stdout.read())
        if res:
            return os.fsdecode(res.group(1))
except OSError:
            pass 

0 个答案:

没有答案