我正在使用来自 Yelp 的(很棒的)mrjob库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它取决于标准 python 库中的子进程。在我运行 python2.7.2 的 mac 上,一切都按预期工作
然而,当我切换到在 Ubuntu LTS 11.04 上也使用与 python2.7.2 完全相同的代码时,我遇到了一些奇怪的事情:
mrjob 加载作业,然后尝试使用 subprocess 与其子进程通信并生成此错误:
_build_steps 中的文件“/usr/local/lib/python2.7/dist-packages/mrjob-0.3.1-py2.7.egg/mrjob/emr.py”,第 1212 行 步骤 = self._get_steps() 文件“/usr/local/lib/python2.7/dist-packages/mrjob-0.3.1-py2.7.egg/mrjob/runner.py”,第 1003 行,在 _get_steps 标准输出,标准错误 = steps_proc.communicate() 文件“/usr/lib/python2.7/subprocess.py”,第 754 行,在通信中 返回self._communicate(输入) _communicate 中的文件“/usr/lib/python2.7/subprocess.py”,第 1302 行 标准输出,标准错误 = self._communicate_with_poll(输入) _communicate_with_poll 中的文件“/usr/lib/python2.7/subprocess.py”,第 1332 行 轮询器 = select.poll() AttributeError:“模块”对象没有属性“轮询”
这似乎是 subprocess 而不是 mrjob 的问题。
我挖掘了 /usr/lib/python2.7/subprocess.py 并发现在导入期间它运行:
如果是 mswindows: ...剪断... 别的: 导入选择 _has_poll = hasattr(select, 'poll')
通过编辑它,我验证它确实设置了 _has_poll==True。这是正确的;在命令行上轻松验证。
但是,当执行进展到使用 Popen._communicate_with_poll 时,选择模块发生了变化!这是通过在尝试使用 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__', '错误', '选择']
没有名为“民意调查”的属性!?!?它是如何消失的?
所以,我硬编码_has_poll=False,然后mrjob愉快地继续它的工作,在AWS EMR中运行我的工作,子进程使用communicate_with_select......我被一个手工修改的标准库困住了......
有什么建议吗?:-)