Существует множество вариантов ответа на этот вопрос. Тем не менее, я специально разработал способ предотвратить закрытие консольного приложения в Python, когда оно не вызывается из терминала (или другой консоли, как это может вызываться в Windows). Пример, где это может произойти, - двойной щелчок по файлу .py
в проводнике Windows.
Как правило, я использую что-то вроде следующего фрагмента кода, но это имеет неприятный побочный эффект при работе, даже если приложение вызывается из существующего терминала:
def press_any_key():
if os.name == "nt":
os.system("pause")
atexit.register(press_any_key)
Предполагается также, что все пользователи Windows вызывают приложение из «оболочки» Windows, и что только пользователи Windows могут выполнять программу из местоположения, отличного от существующего терминала.
Существует ли (предпочтительно кроссплатформенный) способ определения того, было ли мое приложение вызвано из терминала, и / или необходимо ли предоставить функцию «нажать любую клавишу ...» для текущего запущенного экземпляра? Обратите внимание, что использование периодических, bash или любых других обходных путей «процесса обертки» крайне нежелательно.
Update0
Используя ответ Алекса Мартелли ниже, я произвел эту функцию:
def register_pause_before_closing_console():
import atexit, os
if os.name == 'nt':
from win32api import GetConsoleTitle
if not GetConsoleTitle().startswith(os.environ["COMSPEC"]):
atexit.register(lambda: os.system("pause"))
if __name__ == '__main__':
register_pause_before_closing_console()
Если появятся другие подходящие ответы, я добавлю больше кода для других платформ и сред рабочего стола.
Update1
В духе использования pywin32 я создал эту функцию, которая улучшается по сравнению с приведенной выше, используя принятый ответ. Закомментированный код является альтернативной реализацией, возникшей в Update0. Если использование pywin32 невозможно, перейдите по ссылке в принятый ответ . Пауза или getch () по вкусу.
def _current_process_owns_console():
#import os, win32api
#return not win32api.GetConsoleTitle().startswith(os.environ["COMSPEC"])
import win32console, win32process
conswnd = win32console.GetConsoleWindow()
wndpid = win32process.GetWindowThreadProcessId(conswnd)[1]
curpid = win32process.GetCurrentProcessId()
return curpid == wndpid
def register_pause_before_closing_console():
import atexit, os, pdb
if os.name == 'nt':
if _current_process_owns_console():
atexit.register(lambda: os.system("pause"))
if __name__ == '__main__':
register_pause_before_closing_console()