Есть ли лучший способ контролировать 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 с уже найденным каталогом. Тогда вам не придется делать ничего особенного в окружающей среде.

Другие вопросы по тегам