Как python subprocess.Popen может видеть select.poll, а потом не видеть? (объект select 'module' не имеет атрибута 'poll')

Я использую (потрясающую) 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... а я застрял с модифицированной вручную стандартной библиотекой...

Любой совет? :-)

10
задан John Vandenberg 27 September 2017 в 09:43
поделиться