Команди виходу Python - чому так багато і коли їх слід використовувати?


489

Здається, що python підтримує безліч різних команд, щоб зупинити виконання сценарію.
Вибори , які я знайшов , є: quit(), exit(), sys.exit(),os._exit()

Я пропустив будь-який? Яка різниця між ними? Коли ви використовували б кожен?


1
Ви пропустилиos.abort()
The Daleks

Відповіді:


764

Дозвольте дати трохи інформації про них:

  1. quit()просто піднімає SystemExitвиняток.

    Крім того, якщо ви надрукуєте його, воно видасть повідомлення:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    Ця функціональність була включена, щоб допомогти людям, які не знають Python. Зрештою, набирає одну з найбільш вірогідних речей, яку новачок спробує вийти з Python quit.

    Проте, quitслід НЕ використовуватися у виробництві код. Це тому, що він працює лише в тому випадку, якщо siteмодуль завантажений. Натомість цю функцію слід використовувати лише в перекладачі.

  2. exit()є псевдонімом quit(або навпаки). Вони існують разом, щоб зробити Python більш зручним для користувачів.

    Крім того, він також надсилає повідомлення при друкуванні:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    Однак, як quit, exitвважається, погано використовувати у виробничому коді і має бути зарезервоване для використання в інтерпретаторі. Це тому, що він теж покладається на siteмодуль.

  3. sys.exit()також викликає SystemExitвиняток. Це означає, що це те саме, що quitі exitв цьому відношенні.

    На відміну від цих двох, однак, sys.exitвважається хорошим для використання у виробничому коді. Це тому, що sysмодуль завжди буде там.

  4. os._exit()виходить з програми, не викликаючи оброблювачів очищення, промиваючи буфери stdio тощо . Таким чином, це не стандартний спосіб виходу, і його слід застосовувати лише в особливих випадках. Найпоширеніша з них - у дочірніх процесах, створених os.fork.

    Зауважте, що з чотирьох наведених методів, лише цей є унікальним у тому, що він робить.

Підводячи підсумок, усі чотири методи виходять із програми. Однак перші два вважаються поганими для використання у виробничому коді, а останній - нестандартний, брудний спосіб, який використовується лише у спеціальних сценаріях. Отже, якщо ви хочете , щоб вийти з програми , як правило, йдуть з третім способом: sys.exit.


Або, ще краще, на мою думку, ви можете просто безпосередньо робити те, що sys.exitвідбувається за лаштунками та бігати:

raise SystemExit

Таким чином, вам не потрібно спочатку імпортувати sys.

Однак цей вибір просто один із стилів та залежить лише від вас.


2
Але в оболонці ipython, quitа exitпокинути оболонку поки sys.exitнемає.
Лі

5
sys.exit()не є надійним способом закрити. Якщо він викликається всередині потоку, він завершить лише цей потік, якщо він не знаходиться в основному потоці. Це може призвести до безлічі випадків, коли програма триває, тому що виклик не був у основній нитці, тим більше, що деякі інтерпретатори будуть непомітно виконувати виклики.
Елліот

1
Я голосую за додавання endкоманди, яка б raise SystemExit. Не бачите, чому не може бути чогось такого простого, як у BASIC.
Брайан Бернс

6
@BrianBurns: Не варто додавати виділений синтаксис та резервувати інше ключове слово. Це схоже на те, чому printбуло змінено з оператора на функцію. Синтаксис легко додати, але в цьому є вартість складності.
user2357112 підтримує Моніку

1
Чи важливі дужки під час дзвінка sys.exit()?
lindhe

99

Функції * quit() , exit()і sys.exit()функціонують однаково: вони піднімають SystemExitвиняток. Таким чином , немає ніякої різниці, за винятком того, що sys.exit()завжди доступний , але exit()і quit()доступні тільки якщо siteмодуль імпортується.

os._exit()Функція є особливим, він виходить відразу , не викликаючи яких - або функцій очищення (НЕ виштовхнути буфери, наприклад). Це розроблено для вузькоспеціалізованих випадків використання ... в основному, лише у дитини після os.fork()дзвінка.

Висновок

  • Використовуйте exit()або quit()у відповідь.

  • Використовуйте sys.exit()в сценаріях або, raise SystemExit()якщо вам зручніше.

  • Використовуйте os._exit()для дочірніх процесів для виходу після дзвінка на os.fork().

Все це можна викликати без аргументів, або ви можете вказати статус виходу, наприклад, exit(1)або raise SystemExit(1)вийти зі статусом 1. Зверніть увагу, що портативні програми обмежені кодами статусу виходу в діапазоні 0-255, якщо ви використовуєте raise SystemExit(256)в багатьох системах це отримаєте усічення, і ваш процес фактично вийде зі статусом 0.

Виноски

* Насправді quit()і exit()є об'єктами екземпляра, які можна викликати, але я думаю, що це нормально називати їх функціями.


50

Різні засоби виходу

os._exit():

  • Вийдіть з процесу, не викликаючи оброблювачів очищення.

exit(0):

  • чистий вихід без помилок / проблем.

exit(1):

  • Виникла проблема / помилка / проблема, і саме тому програма виходить.

sys.exit():

  • Коли система та пітон вимикаються; це означає, що після запуску програми використовується менше пам'яті.

quit():

  • Закриває файл python.

Підсумок

В основному всі вони роблять те саме, однак це також залежить від того, для чого ви це робите.

Я не думаю, що ви нічого не залишили, і я б рекомендував звикнути quit()або exit().

Ви б використовували sys.exit()і в os._exit()основному, якщо ви використовуєте великі файли або використовуєте python для управління терміналом.

В іншому випадку в основному використовують exit()або quit().


42

sys.exit є канонічним способом виходу.

Внутрішньо sys.exitпросто піднімає SystemExit. Однак дзвінок sys.exitє більш ідіоматичним, ніж підняття SystemExitбезпосередньо.

os.exit - це системний дзвінок низького рівня, який виходить безпосередньо без виклику будь-яких оброблювачів очищення.

quitі exitіснують лише для того, щоб забезпечити простий вихід із підказки Python. Це для нових користувачів або користувачів, які випадково увійшли в запит Python і не хочуть знати правильний синтаксис. Вони, ймовірно, намагаються друкувати exitабо quit. Хоча це не вийде з перекладача, він принаймні видає повідомлення, яке вказує їм вихід:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

Це по суті лише хак, який використовує той факт, що інтерпретатор друкує __repr__будь-яке вираження, яке ви вводите під час запиту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.