Невозможно запустить Python 2 и 3 одновременно из-за ошибок импорта

Я пытаюсь иметь возможность запускать python2 и python3 одновременно на сервере, к которому у меня нет доступа с правами root и который не имеет недавней реализации python3. Это прекрасно работает на моем собственном сервере, к которому у меня есть root-доступ, но я не могу понять, что я делаю неправильно.

Для справки, реализация python2 была установлена ​​администраторами в рассматриваемой системе centos/rocks, и они имеют версии 2.6.6 и 2.7.5. Они также установили python 3.3.2, но есть некоторые вещи в версии 3.4, которые я использую, поэтому я установил версию 3.4.3 на заказ и поместил ее в мои PATH, LIBPATH и PYTHONPATH. Я использую эту версию Python исключительно для своего собственного кода, и я устанавливаю библиотеки там с помощью pip. Я создал свой собственный модуль пород для версии python3, который устанавливает PATH, LIBPATH и LD_LIBRARY_PATH.

Все отлично работает, когда я просто запускаю код Python3. Проблема возникает, когда я пытаюсь одновременно запустить код python3 и код python2 в одном сеансе.

Я написал код на python3, который делает системный вызов для запуска программы на python21. Проблема в том, что для запуска моего кода на python3 у меня установлен PYTHONPATH, содержащий только библиотеки python3. Если библиотеки python2 находятся в этом ПУТИ, я получаю ошибки, подобные этим:

Failed to import the site module
Traceback (most recent call last):
  File "/opt/scipy/2.7/lib/python2.7/site-packages/site.py", line 73, in <module>
    __boot()
  File "/opt/scipy/2.7/lib/python2.7/site-packages/site.py", line 2, in __boot
    import sys, imp, os, os.path   
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/imp.py", line 22, in <module>
    from importlib import util
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/importlib/util.py", line 12, in <module>
    from contextlib import contextmanager
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/contextlib.py", line 4, in <module>
    from collections import deque
  File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/collections/__init__.py", line 17, in <module>
    from reprlib import recursive_repr as _recursive_repr
  File "/opt/biotools/qiime/lib/python2.7/site-packages/reprlib/__init__.py", line 8, in <module>
    raise ImportError('Cannot import module from python-future source folder')
ImportError: Cannot import module from python-future source folder

Однако, если я удаляю все содержимое python2 из PYTHONPATH, сценарии python2 завершаются с ошибками, подобными этой:

File "/oasis/projects/nsf/sua137/peanut/usr/lib/python3.4/site.py", line 176
file=sys.stderr)
    ^
SyntaxError: invalid syntax

Единственный способ избежать этого - найти явный PYTHONPATH в вызове кода python2. Это работает, но это очень громоздко и безобразно.

Раньше я держал все свои вещи на python3 в PYTHON3PATH, а вещи на python2 в PYTHONPATH, но теперь кажется, что python3 полностью игнорирует PYTHON3PATH и использует только PYTHONPATH.

Опять же, эта проблема не возникает на моем личном сервере, на котором работает arch linux, а Python 3.4 и Python 2.7 работают бок о бок, хотя мой PYTHONPATH содержит каталоги для обоих.

Я уверен, что я делаю что-то глупое здесь, но я не знаю, что это такое.


1 Сноска для предотвращения глупых комментариев: они написаны мной не на python2-скрипте, а python3-код - простая система управления заданиями, которая координирует многопоточный непараллельный код на удаленной машине. Предполагается, что любая отдельная программа запускается параллельно, но она не работает со скриптами python2. Поэтому я не могу просто переключить одно или другое на версию 2 или 3, и я не могу объединить два с помощью 2to3 и импорта.

1 ответ

Решение

Вызов python с явным путем или версией решил проблему. Например:

$ python3.x
$ path_to/python
Другие вопросы по тегам