msbuild терпит неудачу и возвращает 1, когда когда я назначаю stdout и stdout для os.devnull, возвращает 0 в противном случае - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь написать скрипт на python, который извлекает ревизию из ртутного репозитория для проекта Visual C ++ для Visual Studio 2010, строит его и затем запускает программу в различных сценариях. Затем я сравню результаты других сборок и т. Д. Итак, я только начинаю с прототипом, и у меня есть:

from subprocess import call
import os
import tempfile
import sys


def main():

    temp_repo_name = 'temprepo'
    d = tempfile.mkdtemp()
    os.chdir(os.path.normpath(d))

    command1 = ['hg', 'clone', r'C:\temp\1\jxg_hcr', temp_repo_name]

    devnull = open(os.devnull,'w')

    rc1 = call(command1,stdout=devnull, stderr=devnull)

    if rc1 != 0:
        print('could not clone repo into temporary directory.  Terminating Program')
        sys.exit(1)

    devnull.close()

    devnull = open(os.devnull,'w')

    os.chdir(temp_repo_name)

    command2 = [r'msbuild', r'hcr_dll.sln', r'/t:Rebuild',r'/p:Configuration=Release']
    rc2 = call(command2,stdout=devnull, stderr=devnull)

    print rc2
    if rc2 != 0:
        print('could not build repo.  Terminating Program')
        sys.exit(1)

    devnull.close()

if __name__ == '__main__':
    main()

Когда я запускаю это, я получаю следующий вывод на моей консоли:

C:\programming\eclipse_workspace\hcr_cli_build>python hcr_cli_build.py
0
1
could not build repo.  Terminating Program

Но когда я меняю строку для команды2 на

rc2 = call(command2)

Я получаю

0
<bunch of build output>
0

и он успешно строится. Я не знаю, почему он потерпит неудачу, когда я перенаправлю.

Есть идеи? Может, просто глупая ошибка, которую я не вижу?

ПРИМЕЧАНИЕ: я не думаю, что мне действительно нужно закрывать и снова открывать devnull каждый раз, но это было просто то, что я пробовал, когда пытался выяснить проблему. Я получаю те же результаты, когда просто держу его открытым все время и закрываю в самом конце.

РЕДАКТИРОВАТЬ1: Это также не из командной строки, когда я попробовал это по предложению Дэвида Хесса.

EDIT2: я также убедился, что эта же проблема возникает, когда я создаю пустое консольное приложение C # с основной функцией панели управления котлом. Он будет собираться через графический интерфейс и из командной строки, когда msbuild не перенаправляется в NUL, но когда я делаю перенаправление, он возвращает 1 и не строит.

Bounty Edit: меня больше всего интересует, почему это происходит. Очевидно, что я также хотел бы иметь возможность молча преуспеть и просто вывести сообщение о том, что «сборка прошла нормально», если код возврата равен 0, поэтому, если никто не может сказать мне, почему это происходит, щедрость найдет лучшее решение.

Я также пробовал скрипт bash на mintty.exe:

#!/bin/bash
for i in 1 2 3 4
 do
  echo "doing $i"
  msbuild.exe /c/temp/$i/jxg_hcr/hcr_dll.sln //t:Rebuild //p:Configuration=Release
  echo $?
 done

работает (печатает все выходные данные и успешно строит, а затем выводит 0 на консоль), но

#!/bin/bash
for i in 1 2 3 4
 do
  echo "doing $i"
  msbuild.exe /c/temp/$i/jxg_hcr/hcr_dll.sln //t:Rebuild //p:Configuration=Release > /dev/null
  echo $?
 done

не выполняет сборку и просто возвращает 1 на консоль.

1 Ответ

3 голосов
/ 16 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...