Python, чтобы закрыть собственное окно командной консоли при выходе



Я запускаю несколько процессов (сотни), каждый из которых находится в python и вызывается с помощью:



command = 'start cmd /k call python %s' % (some_py_prog)
os.system(command)


Где /k оставляет окно cmd открытым после выполнения. Это хорошо проверить на наличие ошибок. Однако, когда я называю сотни заданий, мой экран становится загроможденным.



Как же тогда заставить python закрыть свое собственное окно host cmd только при успешном завершении? Мне нужно, чтобы ошибочная работа оставалась видимой.

1445   2  

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 /k while python.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, теперь содержит две команды:

  1. интерпретатор Python python.exe со скриптом для выполнения как параметр
    и
  2. внутренняя команда exit, в соответствии с которой эта вторая команда должна выполняться интерпретатором команд Windows, только если код выхода первой команды является 0 из-за оператора &&.

Смотрите ответ наодну строку с несколькими командами с помощью пакетного файла Windows для получения подробной информации об одной командной строке с несколькими командами для выполнения.

Каждый амперсанд должен быть экранирован здесь символом escape интерпретатора команд Windows который является символом каре ^. Это необходимо, так как в противном случае && будет интерпретироваться первым командным процессом, выполняющим start, как дополнительная команда для запуска после успешного выполнения start.

Обратите внимание, что у меня не установлен Python и поэтому я сделал только следующий тест из окна командной строки, используя пакетный файл 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

    Ничего не найдено.