vsvars32.bat завершается ошибкой, когда вызывается из Python в BuildBot, запущенном как служба

У меня есть простой скрипт на python, который вызывает vsvars32.bat Visual Studio для настройки среды, а затем выводит переменные среды. Скрипт python может быть запущен как отдельный скрипт или как шаг в BuildBot.

Проблема, с которой я сталкиваюсь, заключается в том, что у меня другое поведение при запуске из CLI в качестве автономного скрипта и при запуске через Buildbot.

Фрагмент скрипта Python:

    proc = subprocess.Popen("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\Tools\\vsvars32.bat & set", ,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    print "STDOUT %s \n" % stdout
    print "STDERR %s \n" % stderr

Фрагмент vsvars32.bat (я добавил верхнюю строку в пакетный файл по умолчанию):

echo "%VS120COMNTOOLS%"

@call :GetVSCommonToolsDir
@if "%VS120COMNTOOLS%"=="" goto error_no_VS120COMNTOOLSDIR

Сейчас.

  • Когда я запускаю скрипт из CLI, он работает нормально: запускает vsvars32.bat, который устанавливает все необходимые переменные, такие как INCLUDE, LIB, LIBPATH, PATH. В списке всех переменных env.variable есть также VS120COMNTOOLS (как и ожидалось).

  • Однако когда я запускаю скрипт в BuildBot, vsvars32.bat завершается с ошибкой

Running C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat
STDOUT 
>echo "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\" 
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\" 
ERROR: Cannot determine the location of the VS Common Tools folder.

Таким образом, несмотря на то, что я повторяю "%VS120COMNTOOLS%", на самом деле возвращает правильное значение (путь), скрипт все равно не работает. VS120COMNTOOLS также отсутствует в списке всех переменных среды (команда set). Зачем??

  • Я также безуспешно пытался установить эту переменную явно, установив
    my_env = os.environ.copy()
    my_env["VS120COMNTOOLS"] = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\"
    а затем передать его в подпроцесс. Откройте с параметром env = my_env.

ОБНОВИТЬ

Поэтому я наивно полагал, что проблема не может быть в файле vsvars32.bat. Я только сейчас понял, что между строкой, которая работает, и строкой, которая не работает, есть "@call:GetVSCommonToolsDir".

Итак, теперь я довольно уверен, что следующий код внутри vsvars32.bat ведет себя по-разному, когда я работаю как зарегистрированный пользователь и при работе в качестве службы. Какие-либо предложения?

@REM -----------------------------------------------------------------------
:GetVSCommonToolsDir
@set VS120COMNTOOLS=
@call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper64  HKLM > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper64  HKCU > nul 2>&1
@exit /B 0

:GetVSCommonToolsDirHelper32
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "12.0"') DO (
    @if "%%i"=="12.0" (
        @SET "VS120COMNTOOLS=%%k"
    )
)
@if "%VS120COMNTOOLS%"=="" exit /B 1
@SET "VS120COMNTOOLS=%VS120COMNTOOLS%Common7\Tools\"
@exit /B 0

:GetVSCommonToolsDirHelper64
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "12.0"') DO (
    @if "%%i"=="12.0" (
        @SET "VS120COMNTOOLS=%%k"
    )
)
@if "%VS120COMNTOOLS%"=="" exit /B 1
@SET "VS120COMNTOOLS=%VS120COMNTOOLS%Common7\Tools\"
@exit /B 0

0 ответов

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