Python, чтобы закрыть собственное окно командной консоли при выходе
Я запускаю несколько процессов (сотни), каждый из которых находится в python и вызывается с помощью:
command = 'start cmd /k call python %s' % (some_py_prog)
os.system(command)
Где /k оставляет окно cmd открытым после выполнения. Это хорошо проверить на наличие ошибок. Однако, когда я называю сотни заданий, мой экран становится загроможденным.
Как же тогда заставить python закрыть свое собственное окно host cmd только при успешном завершении? Мне нужно, чтобы ошибочная работа оставалась видимой.
2 ответов:
Давайте сначала проанализируем, что две опубликованные строки скрипта Python действительно делают при выполнении скрипта Python. Спасибо eryksun за его глубокое исследование, действительно использующее Python, приводящее к правильному описанию, как это можно прочитать ниже.
os.system()приводит к выполнениюcmd.exe /Cна переднем плане с консольным окном и останавливает выполнение скрипта Python до тех пор, пока интерпретатор команд Windows не завершится. Если сам скрипт Python выполняется в консоли, то запущенныйcmd.exeнаследует эту консоль.Этот командный процесс начинается с
start, внутренней командыcmd.exe, еще одного командного процесса с окном консоли переднего плана. Прекрасно, но этот второй командный процесс завершается немедленно по завершении выполнения команды. Это не так хорошо, если вы хотите видеть ошибки, выводимые выполняемым скриптом или самим интерпретатором Python при запуске скрипта Python.Таким образом, второй командный процесс запускается
cmd.exeс опцией/kдля продолжения работы этот командный процесс наследует консоль, созданную с помощьюstart, и окно консоли открывается после завершения выполнения указанной команды.Второй командный процесс запускает внутреннюю команду
call, которая вообще не нужна, потому чтоpythonнаходится в реальномpython.exe, консольном приложении, а не в пакетном файле. Поэтомуcallвообще не нужен.Желательно всегда указывать приложения и скрипты с полным именем файла, т. е. имя файла + расширение файла и не только имя файла. Если путь к исполняемому файлу / скрипту известен и фиксирован, его тоже следует указать. Это делает выполнение приложения / скрипта независимым от текущего каталога и переменных окружения
PATHEXTиPATH.Интерпретатор Python выполняет указанный скрипт Python во второй консоли.
Первый командный процесс, начатый с
os.system(), завершается сразу послеstart, что происходит уже после запускаcmd.exe /kwhilepython.exeинтерпретирует скрипт Python.Таким образом, остается второй командный процесс, запускающий интерпретатор Python со скриптом. Этот командный процесс продолжает выполняться даже после завершения интерпретатора Python после завершения выполнения указанного скрипта Python.
Таким образом, цель состоит в том, чтобы завершить также второй командный процесс с консольным окном, как только интерпретатор Python закончил выполнение скрипта Python, но только в том случае, если при выполнении скрипта Python не произошло ошибки. скрипт.
Ну, у меня вообще не установлен Python, но я предполагаю, что он выходит с кодом возврата больше 0 на ошибку при выполнении скрипта. В противном случае код выхода равен 0 при успешном выполнении скрипта.
Таким образом, можно использовать следующую команду:
command = 'start cmd.exe /K python.exe %s ^&^& exit' % (some_py_prog) os.system(command)Командная строка для выполнения вторым командным процессом, начатым с
start cmd.exe /K, теперь содержит две команды:
- интерпретатор Python
python.exeсо скриптом для выполнения как параметр
и- внутренняя команда
exit, в соответствии с которой эта вторая команда должна выполняться интерпретатором команд Windows, только если код выхода первой команды является0из-за оператора&&.Смотрите ответ наодну строку с несколькими командами с помощью пакетного файла Windows для получения подробной информации об одной командной строке с несколькими командами для выполнения.
Каждый амперсанд должен быть экранирован здесь символом escape интерпретатора команд Windows который является символом каре
Обратите внимание, что у меня не установлен Python и поэтому я сделал только следующий тест из окна командной строки, используя пакетный файл^. Это необходимо, так как в противном случае&&будет интерпретироваться первым командным процессом, выполняющимstart, как дополнительная команда для запуска после успешного выполненияstart.Test.batС одной командной строкой@echo %~dp0 executed. & exit /B 1.start cmd.exe /K call Test.bat ^&^& exit
Test.batэто пакетный файл, а не исполняемый файл, который требует использования командаcall. Запущенный командный процесс без определенного заголовка окна остается открытым, посколькуTest.batзавершается с кодом возврата 1. Запущенный командный процесс завершается сам собой, если я изменяю вTest.batчисло от 1 до 0 в конце командной строки.Конечно, необходимо, чтобы сам код скрипта останавливал выполнение скрипта на ошибке, обнаруженной кодом скрипта при использовании этого решения.
Краткий ответ: просто используйте
/cвместо/kвызовет выход сценария cmd, как только команда завершится, что и требуется:command = 'start cmd /c call python %s' % (some_py_prog) os.system(command)Но вы складываете некоторые ненужные
cmd.exeздесь: один для вызоваos.system, один для явногоcmd.c. Вы можете просто использовать модульsubprocess:subprocess.call('python %s' % (some_py_prog), creationflags = subprocess.CREATE_NEW_CONSOLE)Флага создания достаточно, чтобы система запустила новый процесс в новой консоли, которая будет закрыта, как только команда будет завершена. Опционально, вы можете добавьте опцию
shell=True, если она нужна для предварительной обработки некоторых командлетных лакомств, таких как перенаправление ввода-вывода.(Более подробно в том другом ответе из моего, особенно в комментарии эриксуна)
Comments