2010-10-11 1 views
2

я борюсь с установкой мои Scons переменные среды для Visual Studio 2008.
Обычно я следующее:Как настроить переменные среды vsvars32?

%VS90COMNTOOLS%vsvars32.bat 

or 

call %VS90COMNTOOLS%vsvars32.bat 

И это работает в моей оболочке.

Я пытаюсь сделать это в Python, используя подпроцесс

subprocess.call([os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 

выход:

d:\N\workspace>scons test 
scons: Reading SConscript files ... 
Setting environment for using Microsoft Visual Studio 2008 x86 tools. 
KeyError: 'INCLUDE': 

выше вызывает пакетный процесс, но переменные окружения не наследуется от него к моему «мастер-процесс.

Когда я использую:

subprocess.call([os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 

я получаю:

d:\N\workspace>scons test 
scons: Reading SConscript files ... 
WindowsError: [Error 2] The system cannot find the file specified: 
    File "D:\N\workspace\SConstruct", line 17: 
    subprocess.Popen(["call ", os.environ['VS90COMNTOOLS']+r"\vsvars32.bat"]) 
    File "C:\Python26\lib\subprocess.py", line 595: 
    errread, errwrite) 
    File "C:\Python26\lib\subprocess.py", line 821: 
    startupinfo) 

Как добиться этого?

ответ

4

Напишите командный файл, который запускает vsvars32.bat, а затем выводит значения в форме VARNAME=value, а затем ваш скрипт Python анализирует значения и вводит их в os.environ.

Это делается в собственном модуле distutils python, see the source here.

+0

Я не рассматривал этот способ, но кажется, что нет возможности сделать это с помощью библиотеки подпроцессов python (никаких скрытых скрытых опций;). Итак, я приму свой ответ. – bua

+2

Причина, по которой это невозможно сделать, состоит в том, что каждый процесс имеет свою собственную среду, а среды могут передаваться только дочерним процессам, а не передаваться родительским процессам. Поэтому мы используем «внеполосный» метод связи, чтобы передать значения * * родителям. –

0

В дополнение к предыдущему ответу. Отрывок из моей SConstruct:

for key in ['INCLUDE','LIB']: 
    if os.environ.has_key(key): 
     env.Prepend(ENV = {key.upper():os.environ[key]}) 

Пожалуйста, позаботьтесь, что имена переменных в Python чувствительны к регистру. Убедитесь, что у вашего env['ENV'] dict нет дубликатов имен переменных с другим случаем, иначе оболочка Windows увидит только один вариант этой переменной.

 Смежные вопросы

  • Нет связанных вопросов^_^