Как обрабатывать конфликтующие виртуальные среды в Python - PullRequest
0 голосов
/ 31 августа 2018

У нас есть приложение, которое использует Python 3.6.1 (и другие вещи, такие как Django, mod_wsgi, Rabbitmq). Менеджер приложения изначально был построен на Windows, и я перенес его в Linux. Чтобы все заработало, я переместил приложение в виртуальную среду. Проблема, с которой я столкнулся сейчас, заключается в том, что я пытаюсь вызвать различные сторонние приложения, которые мы использовали ранее, и одно из них настроено в собственной виртуальной среде (с использованием Python 2.7). Я не могу запустить это приложение из новой среды Python 3. Когда я запускаю код, который вызывает стороннее приложение, импорт не выполняется. Я попытался внести изменения в файл, который отказывается импортировать, чтобы внести изменения в синтаксис, необходимые для совместимости с Python 3, но он по-прежнему не импортируется, и я обеспокоен тем, что мне придется делать это для всего приложения. И все равно это может не сработать или не будет верным путем.

Я понимаю, что часть того, что делает установка среды, - это изменение переменных среды и то, что ей нужно, в начале пути, поэтому для меня имеет смысл, что эти две среды находятся в конфликте. Я не знаю, как заставить это работать. Есть ли способ заставить две виртуальные среды работать вместе? А точнее, есть ли хороший способ заставить их работать вместе?

1 Ответ

0 голосов
/ 31 августа 2018

Дерево виртуальной среды содержит каталог bin, и setuptools установит там программы-заглушки, которые правильно настраивают среду Python, а затем запустит в них некоторую основную функцию. Это означает, что вы можете напрямую запускать одну из этих программ-заглушек без "активации" виртуальной среды или установки каких-либо переменных среды.

Если у вас есть дерево каталогов, которое выглядит примерно так:

\--.virtualenvs
  +-- app-py37
  | +-- bin
  | | \-- app
  | \-- lib
  |   \-- ...
  |     \-- app_main.py
  +-- other-py27
    +-- bin
    | \-- helper
    \-- lib
      \-- ...
        \-- helper_main.py

и вы вызвали помощника с помощью вызова, подобного

import os
import subprocess
subprocess.run([os.path.join(os.environ('HOME'),
                             '.virtualenvs', 'other-py27', 'bin', 'helper'],
               check=True)

Я ожидаю, что он правильно настроит свою собственную среду Python.

...