Я использую (потрясающую) mrjob библиотеку от Yelp для запуска моих программ на python в Amazon's Elastic Map Reduce. Она зависит от subprocess в стандартной библиотеке python. На моем mac под управлением python2.7.2 все работает как ожидалось
Однако, когда я перешел к использованию точно такого же кода на 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 каким-то образом изменился! Это происходит при печати dir(select) прямо перед попыткой использовать select.poll().
['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']
нет атрибута под названием 'poll'!!!? Как он исчез?
Итак, я жестко закодировал _has_poll=False, после чего mrjob радостно продолжает свою работу, запускает мою работу в AWS EMR, с подпроцессом, использующим communicate_with_select... а я застрял с модифицированной вручную стандартной библиотекой...
Любой совет? :-)