gpt4 book ai didi

python - python subprocess.Popen 怎么能看到 select.poll 然后又看不到? (选择 'module' 对象没有属性 'poll' )

转载 作者:太空狗 更新时间:2023-10-29 20:28:40 25 4
gpt4 key购买 nike

我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 python2.7.2 的 mac 上,一切都按预期工作

但是,当我切换到在 Ubuntu LTS 11.04 上也使用 python2.7.2 使用完全相同的代码时,我遇到了一些奇怪的事情:

mrjob 加载作业,然后尝试使用 subprocess 与其子进程通信并生成此错误:

      File "/usr/local/lib/python2.7/dist-packages/mrjob-0.3.1-py2.7.egg/mrjob/emr.py", line 1212, in _build_steps        steps = self._get_steps()      File "/usr/local/lib/python2.7/dist-packages/mrjob-0.3.1-py2.7.egg/mrjob/runner.py", line 1003, in _get_steps        stdout, stderr = steps_proc.communicate()      File "/usr/lib/python2.7/subprocess.py", line 754, in communicate        return self._communicate(input)      File "/usr/lib/python2.7/subprocess.py", line 1302, in _communicate        stdout, stderr = self._communicate_with_poll(input)      File "/usr/lib/python2.7/subprocess.py", line 1332, in _communicate_with_poll        poller = select.poll()    AttributeError: 'module' object has no attribute 'poll'

这似乎是 subprocess 而不是 mrjob 的问题。

我深入研究了/usr/lib/python2.7/subprocess.py 并发现在导入过程中它运行了:

    if mswindows:        ... snip ...    else:        import select        _has_poll = hasattr(select, 'poll')

通过对其进行编辑,我验证了它确实设置了 _has_poll==True。这是正确的;在命令行上轻松验证。

但是,当执行进展到使用 Popen._communicate_with_poll 时,select 模块不知何故发生了变化!这是通过在尝试使用 select.poll() 之前打印 dir(select) 生成的。

    ['EPOLLERR', 'EPOLLET', 'EPOLLHUP', 'EPOLLIN', 'EPOLLMSG',     'EPOLLONESHOT', 'EPOLLOUT', 'EPOLLPRI', 'EPOLLRDBAND',     'EPOLLRDNORM', 'EPOLLWRBAND', 'EPOLLWRNORM', 'PIPE_BUF',     'POLLERR', 'POLLHUP', 'POLLIN', 'POLLMSG', 'POLLNVAL',     'POLLOUT', 'POLLPRI', 'POLLRDBAND', 'POLLRDNORM',    'POLLWRBAND', 'POLLWRNORM', '__doc__', '__name__',     '__package__', 'error', 'select']

没有名为“投票”的属性!?!?它是怎么消失的?

因此,我对 _has_poll=False 进行了硬编码,然后 mrjob 愉快地继续其工作,在 AWS EMR 中运行我的工作,使用 communicate_with_select 的子进程......我被手工修改的标准库困住了......

有什么建议吗? :-)

最佳答案

我遇到了类似的问题,事实证明 gevent 将内置的 select 模块替换为没有 gevent.select.select poll 方法(因为它是一种阻塞方法)。但是由于某些原因,默认情况下 gevent 不会修补使用 select.pollsubprocess

一个简单的解决方法是将 subprocess 替换为 gevent.subprocess:

import gevent.monkey
gevent.monkey.patch_all(subprocess=True)

import sys
import gevent.subprocess
sys.modules['subprocess'] = gevent.subprocess

如果您在导入 mrjob 库之前执行此操作,它应该可以正常工作。

关于python - python subprocess.Popen 怎么能看到 select.poll 然后又看不到? (选择 'module' 对象没有属性 'poll' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9087510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com