Есть ли лучший способ контролировать PYTHONPATH подпроцесса?
У меня есть набор скриптов, которые должны изменять os.sys.path на лету. Затем сценарии запускают подпроцесс. В идеале подпроцесс должен иметь тот же os.sys.path, что и вызывающий. Я хочу избежать передачи его в качестве аргумента, так как это потребует модификации скрипта подпроцесса.
У меня есть код, который работает и отвечает всем моим потребностям. Я хочу знать, есть ли лучший способ сделать это, и есть ли какие-либо подводные камни в этом подходе.
Основной процесс
import os
import sys
import subprocess
#append a dir thats not on the sys path
sys.path.append('C:/pytest2/')
#convert the sys.path into env variable format
pypath = ''
for d in sys.path:
pypath = pypath + d + ';'
#create a temp copy of the env variables
myenv = os.environ.copy()
#set PYTHONPATH to match this scripts sys.path
myenv['PYTHONPATH'] = pypath
#setup a python command to echo the sys.path
command = 'python C:/pytest/test_subprocess.py'
#launch the subprocess with the custom env
p = subprocess.Popen(command, env=myenv)
C:/pytest/test_subprocess.py
import sys
print 'sys path'
print sys.path
Запуск основного процесса приводит к выводу этой консоли
Как видите, C:/pytest2/ находится на os.sys.path для test_subprocess.py
РЕДАКТИРОВАТЬ Изменен os.sys на sys
1 ответ
Переменная окружения PYTHONPATH просто добавляется к sys.path
, Сам Python (и site
модуль) инициализировать путь поиска модуля из различных источников. Вам нужно только добавить один каталог через переменную окружения PYTHONPATH. Еще лучше было бы просто установить его в обычный каталог site-packages с уже найденным каталогом. Тогда вам не придется делать ничего особенного в окружающей среде.