Закрытие консольного приложения после завершения из Python - PullRequest
2 голосов
/ 13 ноября 2011

У меня есть exe-файл, который мне нужно вызвать с несколькими параметрами, и для этого я использую bat-файл.После запуска bat-файла командная строка не закрывается, но подождите, пока я нажму клавишу.Теперь мне нужно запустить этот exe несколько раз, и для этого я хочу запустить скрипт, который сделает это за меня.

i = 0
for path in Paths
    outout = codecs.open('runExe.bat', 'w')
    output.write(PathToExe + " -param1" + " -param2 " + param2Val[0] + " -param3 " + param3Val[0] + " -param4 " + param4Val[0] + " -param5 param5Val")
    output.close()
    subprocess.call(["regsvr32.exe", path, "-u", "-s"])
    subprocess.call(["regsvr32.exe", path, "-s"])
    subprocess.call("runExe.bat")
    i + = 1

где param3Val, param4Val, param5Val - это списки со значениями для связанных параметров командной строки.
Когда я вызываю этот bat-файл, все отлично работает для первого удовольствия exe, но после того, как он выполняетсяКоманда Promt ждет моего ответа.Когда я нажимаю любую клавишу, она закрывается, а затем исполняемый файл запускается с другими параметрами.
Так что я хочу устранить с нажатием клавиши вещь.Я пытался поставить «выход» в конец файла bat, но это не сработало.Как мне закрыть окно командной строки из скрипта, когда exe закончит работу?
Заранее спасибо!enter image description here Upd1: способ работы sarmold работает нормально, но я думаю, что это exe (консольное приложение), которое ждет моего ответа.Что-то в exe-файле препятствует закрытию окна консоли, но у меня нет доступа к источникам.Как я могу закрыть его окно после его запуска?

Upd2: я пытался добавить вызов «shell» после subprocess.call, но, похоже, это тоже не работает, все равно приходится отвечать на консоль вручную:(

shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Command Prompt")
shell.SendKeys("cls(ENTER)")

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Здесь возможны два подхода:

  1. Создайте только один файл bat, содержащий все ваши команды, включая команды regsvr32.exe, и выполните его.

  2. Пусть скрипт Python сделает все за вас.

Для первого подхода используйте открытый режим "a", чтобы добавить к пакетному файлу.(Возможно, удалите его при запуске скрипта.) Запишите содержимое ваших трех команд в пакетный файл в цикле - так вы получите пакетный файл длиной , содержащий все необходимые вам команды.

Затем вызовите команду subprocess.call() один раз, вне цикла, в конце скрипта, чтобы запустить весь процесс.

Для второго подхода удалите all theзапись пакетного файла и запуск вашего PathToExe с использованием Python subprocess.call().Это почти так же просто, как удалить все строки, которые работают с output, но изменить output.write() на subprocess.call() - и, очевидно, немного поиграть с содержимым, чтобы они работали для subprocess.call() напрямую.

1 голос
/ 06 апреля 2012

Вы используете это таким образом, что каждый раз при запуске runExe.bat запускается командная строка? Он не должен обязательно ждать, пока вы закроете консоль, но, поскольку это произойдет, попробуйте запустить скрипт с subprocess.call("cmd /C runExe.bat").

.

@ Арнольд прав, хотя: лучше упростить настройку и (imho) просто позволить python обрабатывать все.

...