Когда программа заканчивает свою работу, она должна закрыть все открытые ресурсы, очистить память и завершить свою работу. В Python для этого обычно используют функции exit() и quit(). Однако, иногда эти функции не закрывают программу и оставляют ее работать в фоновом режиме. Это может быть связано с несколькими причинами, которые мы рассмотрим в этой статье.
Что такое функции exit() и quit()
Функции exit() и quit() в Python используются для завершения работы программы. Они могут быть вызваны посредством командной строки или встроенного интерпретатора. Функция quit() эквивалентна функции exit(). Они обе принимают необязательный аргумент кода выхода, который будет возвращен операционной системе после завершения работы программы.
Почему программа не закрывается при использовании exit() и quit()
1. Остановленные потоки
Когда программа создает дополнительные потоки, они могут продолжать работать после вызова функций exit() и quit(). Это связано с тем, что эти функции завершают только главный поток программы, но не останавливают дополнительные потоки. Для того чтобы остановить основной поток, необходимо остановить все дополнительные потоки вручную.
Псевдо-вирус на python
import threading import time def worker(): while True: time.sleep(1) print(‘Working. ‘) t = threading.Thread(target=worker) t.start() input(‘Press Enter to exit. ‘) exit()
В этом примере программа создает дополнительный поток, который бесконечно выводит сообщение в консоль. После вызова функции exit() программа должна завершить свою работу, но дополнительный поток остается работать в фоновом режиме. Чтобы остановить программу полностью, необходимо остановить дополнительный поток с помощью метода join().
import threading import time def worker(): while True: time.sleep(1) print(‘Working. ‘) t = threading.Thread(target=worker) t.start() input(‘Press Enter to exit. ‘) t.join() exit()
В этом примере программа останавливает дополнительный поток с помощью метода join() перед вызовом функции exit(). Теперь программа будет завершать свою работу полностью.
2. Незакрытые файлы
Если программа работает с файлами и не закрывает их перед вызовом функций exit() или quit(), то эти файлы могут оставаться открытыми и не позволять программе завершить свою работу. В этом случае необходимо закрыть все файлы вручную перед вызовом функций exit() или quit().
f = open(‘file.txt’) data = f.read() print(data) exit()
В этом примере программа открывает файл и выводит его содержимое в консоль. После этого программа должна завершить свою работу, но файл остается открытым. Для того чтобы закрыть файл, необходимо вызвать метод close().
f = open(‘file.txt’) data = f.read() print(data) f.close() exit()
В этом примере программа закрывает файл с помощью метода close() перед вызовом функции exit().
3. Циклы обработки событий
Если программа работает в цикле обработки событий, то вызов функций exit() или quit() может не завершить работу программы, если цикл не завершен.
Командная строка закрывается после выполнения команды (Решение)
import tkinter as tk root = tk.Tk() def on_click(): print(‘Button clicked’) button = tk.Button(root, text=’Click me’, command=on_click) button.pack() root.mainloop() exit()
В этом примере программа создает окно с кнопкой. После вызова функции exit() программа должна завершить свою работу, но цикл обработки событий tkinter продолжает работать. Чтобы завершить цикл обработки событий, необходимо вызвать метод quit() объекта tkinter.
import tkinter as tk root = tk.Tk() def on_click(): print(‘Button clicked’) button = tk.Button(root, text=’Click me’, command=on_click) button.pack() root.mainloop() root.quit() exit()
В этом примере программа остановит цикл обработки событий tkinter с помощью метода quit() объекта tkinter перед вызовом функции exit().
В этой статье мы рассмотрели три причины, по которым программа может не закрываться при использовании функций exit() и quit(). Это могут быть остановленные потоки, незакрытые файлы и циклы обработки событий. Чтобы избежать этих проблем, необходимо включать в свой код дополнительные проверки и закрывать все ресурсы перед завершением работы программы.
Похожие записи:
- Есть ли разница между quit и exit?
- Чтение и запись строк через StreamReader и StreamWriter. Программа закрывается
- Действие на закрытом файле. Закрывается программа после выполнения условия
- Программа не закрывается полностью
- Почему программа не закрывается методом psutil.terminate() и psutil.kill()
Источник: qaa-engineer.ru
Python — при выполнении программы через CMD она просто закрывается после второго ввода
По сути, я поместил свой код выше, и после выполнения кода, дважды щелкнув файл .py, который запускает его из CMD, после появления сообщения: «Пожалуйста, введите операцию, которую вы хотите выполнить, +, -, *, /: «
CMD просто случайно закрывается. Это также случилось со всеми моими программами на Python. Есть идеи почему? Это связано с моим ужасным кодом?
Все ответы очень ценятся 🙂
monkey334 14 Сен 2013 в 00:10
4 ответа
Лучший ответ
Попробуй, под main (), напиши
input(«nnPress the enter key to exit: «)
Теперь придется подождать, пока вы нажмете ввод, чтобы он проходил мимо этого ввода и закрывался, попробуйте, надеюсь, я помог 🙂
Infamouslyuseless 13 Сен 2013 в 20:14
Если вы используете Python 2, а не 3.3
Проблема в том, что функция input в python2 выполняет код . это означает, что когда пользователь вводит один из * , + , / , — возникает исключение (так как + или — или * или / не являются полными выражениями или утверждениями), и программа завершается, поэтому CMD закрывается.
Чтобы проверить это, попробуйте обернуть вызов input в оператор try. except :
try: op = input(‘. * / — +’) except Exception: input(‘OPS!’) #just to verify that this is the case.
В частности, это то, что я получаю при попытке ввести + в качестве ввода в python2:
>>> input(») + Traceback (most recent call last): File «», line 1, in File «», line 1 + ^ SyntaxError: unexpected EOF while parsing
В python2 вы должны использовать функцию raw_input , которая возвращает строку. В python3 raw_input был переименован в input , и поэтому ваша программа работает нормально и не показывает поведение, которое вы описываете.
Bakuriu 13 Сен 2013 в 20:33
Вам нужно использовать raw_input() вместо input()
Так что внесите следующие изменения
def main() . op = raw_input («Please enter the operation you wish to perform, +, -, *, / : «) .
mu 無 13 Сен 2013 в 20:57
Это связано с тем, как Windows обрабатывает выполнение. По умолчанию закрывается сразу после завершения программы. Может быть настройка, чтобы исправить это, но быстрое решение состоит в том, чтобы открыть командную строку, cd в направлении, и выполнить ваш сценарий напрямую.
Источник: question-it.com
Как сохранить окно вывода скрипта Python открытым?
Я только что начал с Python. Когда я запускаю файл python script в Windows, окно вывода появляется, но мгновенно исчезает. Мне нужно, чтобы он остался там, чтобы я мог анализировать мои результаты. Как я могу открыть его?
rohitmishra 16 июнь 2009, в 12:01
Поделиться
Запоздалый +1000. Я использую python в качестве обучающего языка для друга, который использует Windows, и я не мог поверить, насколько трудно (по крайней мере, на основе существующей документации) добраться до места, где мы могли бы запустить скрипт и посмотреть результат.
Cascabel 23 июль 2011, в 18:08
просто перетащите ваш скрипт в окно cmd
JinSnow 10 фев. 2017, в 12:23
Вы могли бы подумать, что окно вывода должно оставаться открытым по умолчанию. Это происходит при запуске Python в Mac OS. Очень расстраивает
Fandango68 30 нояб. 2017, в 06:45
Я собираюсь связать с этим вопросом еще один вопрос: оставьте консоль Windows открытой после ошибки Python (на которую я отправил ответ для отладки с помощью сценариев перетаскивания и переноса).
akinuri 16 май 2018, в 09:06
roryhewitt 06 сен. 2018, в 20:42
Показать ещё 3 комментария
Поделиться:
14 ответов
Лучший ответ
У вас есть несколько вариантов:
-
Запустите программу с уже открытого терминала. Откройте командную строку и введите:
python myscript.py
raw_input()
nosklo 16 июнь 2009, в 12:46
Поделиться
+1 к пункту 3. Я использую Scite в качестве редактора Python, и он просто сохраняет вывод в собственном окне вывода. Это действительно полезно, потому что вы можете увидеть результаты более чем одного запуска в одном окне.
Joris Timmermans 16 июнь 2009, в 12:14
Я могу увидеть вывод, запустив его с уже открытого терминала. Но мне нужно дать полный адрес скрипта в команде python? Можно ли этого избежать? Когда я использую метод raw_input (), он выдает мне NameError: имя ‘raw_input’ не определено. Можете ли вы предложить редактор, который автоматически останавливается после выполнения?
rohitmishra 16 июнь 2009, в 12:20
nosklo 16 июнь 2009, в 13:30
rohitmishra 16 июнь 2009, в 14:25
v.oddou 19 янв. 2015, в 03:20
У меня есть еще лучший способ: используйте os . Я использую следующий код: import os os.system(«PAUSE») для окон и import os os.system(‘read -p «»‘) . Это кажется более чистым способом сделать это.
IronManMark20 04 май 2015, в 23:15
Вариант 3 должен быть первым пунктом в этом списке.
Jonny 16 фев. 2017, в 16:58
nosklo 11 апр. 2017, в 17:26
Реализация варианта 3 работает в NotePad ++ для Python 3
DaveK 28 авг.
2018, в 12:25
Показать ещё 7 комментариев
cmd /k — это типичный способ открыть любое консольное приложение (не только Python) с консольным окном, которое останется после закрытия приложения. Самый простой способ, которым я могу это сделать, — нажать Win + R, набрать cmd /k , а затем перетащить Запуск».
tzot 23 июнь 2009, в 11:55
Поделиться
да это тоже работает
rohitmishra 24 июнь 2009, в 13:44
Фантастический ответ. Ты должен был это получить.
Jagu 26 окт.
2011, в 06:08
Просто для вашей команды python os.system вы должны выполнить os.system («cmd / k» + myAppPath + «» + myFlagsString)
Jared 06 дек. 2011, в 08:01
cmd /k только для Windows. Я не могу помочь с альтернативой Mac, извините.
tzot 09 март 2012, в 17:20
Нужно ли перетаскивать скрипт, включая саму команду Python? Извините, можно привести пример? Я новичок, очень плохо знаком с Python под Windows.
Fandango68 30 нояб. 2017, в 06:51
Показать ещё 3 комментария
Запустите script из уже открытого CMD-окна или в конце script добавьте что-то подобное в Python 2:
raw_input(«Press enter to exit ;)»)
input(«Press enter to exit ;)»)
Anurag Uniyal 16 июнь 2009, в 12:09
Поделиться
«Любая клавиша» не будет работать, будет работать только Enter (или Ctrl + D, в зависимости от того, где мы находимся).
Daniel Andersson 02 нояб. 2013, в 18:01
Anurag Uniyal 03 нояб. 2013, в 23:17
Если вы думаете об этом, это довольно глубоко, что только «войти» позволит вам «выйти» .
Joel B 05 нояб. 2013, в 23:54
Показать ещё 1 комментарий
Чтобы ваше окно открылось в случае исключения (при печати исключения с использованием https://stackoverflow.com/a/3702726/2436175)
if __name__ == ‘__main__’: try: ## your code, typically one function call except: import sys print sys.exc_info()[0] import traceback print traceback.format_exc() print «Press Enter to continue . » raw_input()
Чтобы открыть окно в любом случае:
if __name__ == ‘__main__’: try: ## your code, typically one function call except: import sys print sys.exc_info()[0] import traceback print traceback.format_exc() finally: print «Press Enter to continue . » raw_input()
Antonio 12 март 2014, в 14:06
Поделиться
спасибо Антонио!
LetzerWille 17 окт. 2015, в 16:17
вы можете комбинировать ответы до: (для пользователя Notepad ++)
нажмите F5 для запуска текущего script и введите команду:
cmd /k python -i «$(FULL_CURRENT_PATH)»
таким образом вы остаетесь в интерактивном режиме после выполнения вашего Notepad ++ python script, и вы сможете играть со своими переменными и так далее:)
feinmann 10 фев. 2012, в 19:41
Поделиться
Это отличный пакетный файл Windows, если вы измените $ (FULL_CURRENT_PATH) на имя пути Windows.
Noumenon 27 июль 2015, в 13:27
Я обнаружил, что гораздо проще получить плагин PyNPP и назначить ярлык для его запуска (не забудьте отключить предыдущий ярлык F5)
JinSnow 24 нояб. 2016, в 05:50
спасибо, отлично работает
Jackssn 16 окт. 2018, в 17:22
Показать ещё 1 комментарий
В python 2 вы можете сделать это с помощью: raw_input()
>>print(«Hello World!») >>raw_input(‘Waiting a key. ‘)
В python 3 вы можете сделать это с помощью: input()
>>print(«Hello world!») >>input(‘Waiting a key. ‘)
Кроме того, вы можете сделать это с помощью time.sleep(time)
>>import time >>print(«The program will close in 5 seconds») >>time.sleep(5)
Brandon Aguilar 19 авг. 2015, в 00:22
Поделиться
Создайте пакетный файл Windows с этими двумя строками:
python your-program.py pause
maurizio 16 май 2015, в 19:09
Поделиться
Или import os os.system(«pause») в конце файла .py
Spikatrix 25 май 2015, в 11:38
Это единственный ответ, который даже отдаленно правильный.
Ответы, которые требуют повреждения каждого скрипта Python, который вы когда-либо будете запускать с raw_input или другим мусором, просто неверны. Либо введите вашу команду в командной строке так, как ожидает вас Python, либо используйте пакетный язык , предоставляемый MS-DOS именно для этой цели с августа 1981 года .
Kevin J. Chase 06 июнь 2016, в 16:22
еще лучше, используйте python %* и установите его как одну из программ «открыть с помощью», чтобы вы могли либо щелкнуть правой кнопкой мыши по файлу .py, чтобы открыть окно приостановки, либо я также поместил его в папку Anaconda3 (в PATH) как py_pause. bat, так что теперь я могу запустить py_pause my-prog.py all my args из строки cmd
brian 24 май 2017, в 20:40
Это буквально ЕДИНСТВЕННЫЙ правильный ответ.
roryhewitt 06 сен. 2018, в 20:41
Показать ещё 2 комментария
У меня была аналогичная проблема. С помощью Notepad ++ я использовал команду: C:Python27python.exe «$(FULL_CURRENT_PATH)» , которая закрыла окно cmd сразу после завершения кода.
Теперь я использую cmd /k c:Python27python.exe «$(FULL_CURRENT_PATH)» , который закрывает окно cmd.
Matej 18 дек. 2010, в 11:26
Поделиться
Вы можете добавить «; C: Python27» в конец переменной среды Path. Таким образом, его можно сократить до ‘cmd / k python -i «$ (FULL_CURRENT_PATH)»‘ — именно то, что сказано выше, плюс полезный -i.
Enigma 12 дек. 2012, в 23:34
Используя atexit , вы можете приостановить программу сразу после ее выхода. Если причиной ошибки является ошибка/исключение, она приостанавливается после печати stacktrace.
import atexit # Python 2 should use `raw_input` instead of `input` atexit.register(input, ‘Press Enter to continue. ‘)
В моей программе я поместил вызов atexit.register в предложение except , так что он будет только приостанавливаться, если что-то пошло не так.
if __name__ == «__main__»: try: something_that_may_fail() except: # Register the pause. import atexit atexit.register(input, ‘Press Enter to continue. ‘) raise # Reraise the exception.
leewz 03 дек. 2015, в 18:48
Поделиться
Чтобы просто оставить окно открытым, я согласен с Anurag, и это то, что я сделал, чтобы мои окна открывались для коротких небольших программ типа расчета.
Это просто покажет курсор без текста:
raw_input()
В следующем примере вы получите четкое сообщение о том, что программа выполнена и не ждет другого приглашения ввода внутри программы:
print(‘You have reached the end and the «raw_input()» function is keeping the window open’) raw_input()
Внимание!
(1) В python 3 нет raw_input(), просто вход().
(2) Используйте одинарные кавычки, чтобы указать строку; в противном случае, если вы набираете дубликаты вокруг чего-либо, например «raw_input()», он будет считать, что это функция, переменная и т.д., а не текст.
В следующем примере я использую двойные кавычки, и не будет работать, потому что он считает, что в кавычках между «и» и «функцией» есть разрыв, хотя, когда вы его читаете, ваш собственный ум может понять это:
print(«You have reached the end and the «input()» function is keeping the window open») input()
Надеюсь, это поможет другим, кто может начать, и до сих пор не понял, как компьютер еще думает. Это может занять некоторое время.: О)
Источник: overcoder.net