Я пытаюсь написать скрипт на 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 на консоль.