Я использую (удивительную) библиотеку mrjob от Yelp для запуска своих программ на python в Amazon Elastic Map Reduce.Это зависит от подпроцесса в стандартной библиотеке Python.На моем Mac с Python2.7.2 все работает как положено
Однако, когда я переключился на использование точно такого же кода на Ubuntu LTS 11.04 также с python2.7.2, я столкнулся с чем-то странным:
mrjob загружает задание, а затем пытается связаться со своими дочерними процессами, используя подпроцесс, и генерирует эту ошибку:
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'
Это похоже на проблему с подпроцессом, а не с 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, модуль выбора как-то меняется!Это генерируется печатью 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, с подпроцессом, использующим communication_with_select ... и я застрял рукойМодифицированная стандартная библиотека ...
Есть совет?: -)