Спасибо за вашу помощь, nullUser; Ваше решение является кратким и правильным ответом на мой вопрос.
Однако, когда я опробовал его, мой сторонний инструмент теперь выходит из строя по какой-то другой (неизвестной) причине. Вероятно, была другая переменная окружения, о которой я не знаю, которая теряется в новой оболочке. К счастью, я нашел альтернативное решение, которым я поделюсь для всех, кто борется.
Мое решение
Насколько я могу судить, единственное отличие, которое делает вход в виртуальную среду для моей среды, заключается в добавлении нового пути к моей переменной PATH и добавлении переменной VIRTUAL_ENV.
Я могу реплицировать поведение внешней виртуальной среды, создав копию своей среды, в которой я:
- удалить эту переменную среды VIRTUAL_ENV и
- удалить префикс python из PATH.
Пример
my_script.py
my_script.py
Реализует мое решение:
#!/usr/bin/env python
import subprocess, os, sys
env = os.environ.copy()
if hasattr(sys,'real_prefix'):
# If in virtual environment, gotta forge a copy of the environment, where we:
# Delete the VIRTUAL_ENV variable.
del(env['VIRTUAL_ENV'])
# Delete the "/home/me/.python_venv/main/bin:" from the front of my PATH variable.
orig_path = env['PATH']
virtual_env_prefix = sys.prefix + '/bin:'
env['PATH'] = orig_path.replace(virtual_env_prefix, '')
# Pass the environment into the third party tool, modified if and when required.
subprocess.run(['./third-party-tool'], shell=False, env=env)
третья сторона-инструмент
third-party-tool
смоделирован как скрипт, который сообщает вам, находится ли он в виртуальной среде, и распечатывает переменные среды. В этом примере third-party-tool
является скриптом Python, но в общем случае это может быть не так.
#!/usr/bin/env python
# third-party-tool
import sys, os
in_venv = hasattr(sys, 'real_prefix')
print('This is third-party Tool and you {} in a virtual environment.'.format("ARE" if in_venv else "ARE NOT"))
os.system('env')
Тестирование
Теперь я пытаюсь вызвать сторонний инструмент из-за пределов виртуальной среды, изнутри виртуальной среды и из скрипта Python в виртуальной среде, захватив выходные данные.
[me@host ~]$ ./third-party-tool > without_venv.txt
# Now I activate virtual environment
(main) [me@host ~]$ ./third-party-tool > within_venv.txt
(main) [me@host ~]$ ./my_script.py > within_venv_from_python.txt
Примечание: выходные данные выглядят так:
Это сторонний инструмент, и вы НЕ находитесь в виртуальной среде.
(Приступает к выводу списка переменных среды KEY = VALUE)
Я использую мой любимый инструмент сравнения и сравниваю результаты. within_venv_from_python.txt
идентичен without_venv.txt
, что является хорошим признаком (в обоих случаях third-party-tool
работает с одинаковыми переменными среды и указывает, что он не живет в матрице). После реализации этого решения мой настоящий сторонний инструмент работает.