Các lệnh thoát Python - tại sao rất nhiều và khi nào nên được sử dụng?


489

Có vẻ như python hỗ trợ nhiều lệnh khác nhau để dừng thực thi tập lệnh.
Các lựa chọn Tôi đã tìm thấy là: quit(), exit(), sys.exit(),os._exit()

Tôi đã bỏ lỡ bất kỳ? Sự khác biệt giữa chúng là gì? Khi nào bạn sẽ sử dụng từng?


1
Bạn đã bỏ lỡos.abort()
The Daleks

Câu trả lời:


765

Hãy để tôi cung cấp một số thông tin về họ:

  1. quit()chỉ đơn giản là tăng SystemExitngoại lệ.

    Hơn nữa, nếu bạn in nó, nó sẽ đưa ra một thông báo:

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

    Chức năng này được bao gồm để giúp những người không biết Python. Rốt cuộc, một trong những điều rất có thể một người mới sẽ cố gắng thoát khỏi Python đang gõ vào quit.

    Tuy nhiên, khôngquit nên được sử dụng trong mã sản xuất. Điều này là do nó chỉ hoạt động nếu mô-đun được tải. Thay vào đó, chức năng này chỉ nên được sử dụng trong trình thông dịch.site

  2. exit()là bí danh cho quit(hoặc ngược lại). Chúng tồn tại cùng nhau chỉ đơn giản là để Python thân thiện hơn với người dùng.

    Hơn nữa, nó cũng cung cấp một thông điệp khi được in:

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

    Tuy nhiên, như quit, exitđược coi là xấu khi sử dụng trong mã sản xuất và nên được dành riêng để sử dụng trong trình thông dịch. Điều này là do nó quá phụ thuộc vào các sitemô-đun.

  3. sys.exit()cũng đưa ra SystemExitngoại lệ. Điều này có nghĩa là nó giống như quitexittrong khía cạnh đó.

    Tuy nhiên, không giống như hai cái đó, sys.exitđược coi là tốt để sử dụng trong mã sản xuất. Điều này là do các sysmô-đun sẽ luôn ở đó.

  4. os._exit()thoát khỏi chương trình mà không gọi xử lý dọn dẹp, đỏ bừng bộ đệm stdio, vv . Vì vậy, nó không phải là một cách tiêu chuẩn để thoát ra và chỉ nên được sử dụng trong những trường hợp đặc biệt. Phổ biến nhất trong số này là trong quá trình con được tạo bởi os.fork.

    Lưu ý rằng, trong bốn phương thức được đưa ra, chỉ có phương pháp này là duy nhất trong những gì nó làm.

Tổng kết, cả bốn phương thức thoát khỏi chương trình. Tuy nhiên, hai cái đầu tiên được coi là xấu khi sử dụng trong mã sản xuất và cái cuối cùng là một cách bẩn thỉu, không chuẩn, chỉ được sử dụng trong các tình huống đặc biệt. Vì vậy, nếu bạn muốn thoát một chương trình bình thường, hãy thực hiện theo phương pháp thứ ba : sys.exit.


Hoặc, thậm chí tốt hơn theo quan điểm của tôi, bạn có thể chỉ cần làm trực tiếp những gì sys.exitđằng sau hậu trường và chạy:

raise SystemExit

Bằng cách này, bạn không cần phải nhập systrước.

Tuy nhiên, sự lựa chọn này chỉ đơn giản là một phong cách và hoàn toàn phụ thuộc vào bạn.


2
Nhưng trong vỏ ipython, quitexitbỏ vỏ trong khi sys.exitkhông.
Lee

5
sys.exit()không phải là một cách đáng tin cậy để đóng cửa. Nếu nó được gọi bên trong một luồng, nó sẽ chỉ chấm dứt luồng đó trừ khi nó nằm trong luồng chính. Điều này có thể dẫn đến rất nhiều trường hợp chương trình tiếp tục vì cuộc gọi không nằm trong luồng chính, đặc biệt là khi một số thông dịch viên sẽ vô hình gọi các cuộc gọi.
Elliot

1
Tôi bỏ phiếu để thêm một endlệnh mà sẽ raise SystemExit. Đừng xem tại sao không thể có thứ gì đó đơn giản như thế, như trong BASIC.
Brian Burns

6
@BrianBurns: Không đáng để thêm cú pháp chuyên dụng và đặt trước một từ khóa khác. Điều này tương tự với lý do tại sao printđược thay đổi từ một câu lệnh thành một hàm. Thật dễ dàng để thêm cú pháp, nhưng có một chi phí phức tạp để làm như vậy.
user2357112 hỗ trợ Monica

1
Là dấu ngoặc đơn quan trọng khi gọi sys.exit()?
lindhe

100

Các hàm * quit() , exit()sys.exit()chức năng theo cùng một cách: chúng đưa ra SystemExitngoại lệ. Vì vậy, không có sự khác biệt thực sự, ngoại trừ sys.exit()luôn luôn có sẵn exit()quit()chỉ có sẵn nếu sitemô-đun được nhập khẩu.

Các os._exit()chức năng rất đặc biệt, nó thoát ngay lập tức mà không gọi bất kỳ chức năng dọn dẹp (nó không đệm tuôn ra, ví dụ). Điều này được thiết kế cho các trường hợp sử dụng chuyên môn cao ... về cơ bản, chỉ ở trẻ sau một os.fork()cuộc gọi.

Phần kết luận

  • Sử dụng exit()hoặc quit()trong REPL.

  • Sử dụng sys.exit()trong các kịch bản, hoặc raise SystemExit()nếu bạn thích.

  • Sử dụng os._exit()cho các tiến trình con để thoát sau khi gọi đến os.fork().

Tất cả những điều này có thể được gọi mà không có đối số hoặc bạn có thể chỉ định trạng thái thoát, ví dụ: exit(1)hoặc raise SystemExit(1)thoát với trạng thái 1. Lưu ý rằng các chương trình di động bị giới hạn để thoát mã trạng thái trong phạm vi 0-255, nếu bạn raise SystemExit(256)trên nhiều hệ thống, điều này sẽ bị cắt ngắn và quá trình của bạn sẽ thực sự thoát với trạng thái 0.

Chú thích

* Trên thực tế, quit()exit()là các đối tượng thể hiện có thể gọi được, nhưng tôi nghĩ việc gọi chúng là các hàm là ổn.


50

Phương tiện thoát hiểm khác nhau

os._exit():

  • Thoát khỏi quá trình mà không gọi trình xử lý dọn dẹp.

exit(0):

  • một lối thoát sạch mà không có bất kỳ lỗi / vấn đề.

exit(1):

  • Có một số vấn đề / lỗi / vấn đề và đó là lý do tại sao chương trình đang thoát.

sys.exit():

  • Khi hệ thống và con trăn tắt; nó có nghĩa là ít bộ nhớ hơn được sử dụng sau khi chương trình được chạy.

quit():

  • Đóng tệp python.

Tóm lược

Về cơ bản tất cả họ đều làm điều tương tự, tuy nhiên, nó cũng phụ thuộc vào những gì bạn đang làm nó cho.

Tôi không nghĩ bạn bỏ bất cứ thứ gì ra ngoài và tôi khuyên bạn nên làm quen với quit()hoặc exit().

Bạn sẽ sử dụng sys.exit()os._exit()chủ yếu nếu bạn đang sử dụng các tệp lớn hoặc đang sử dụng python để điều khiển thiết bị đầu cuối.

Mặt khác chủ yếu sử dụng exit()hoặc quit().


42

sys.exit là cách chính tắc để thoát.

Trong nội bộ sys.exitchỉ tăng SystemExit. Tuy nhiên, gọi sys.exitlà thành ngữ hơn là SystemExittrực tiếp nâng cao .

os.exit là một cuộc gọi hệ thống cấp thấp thoát trực tiếp mà không gọi bất kỳ trình xử lý dọn dẹp nào.

quitexitchỉ tồn tại để cung cấp một cách dễ dàng thoát khỏi dấu nhắc Python. Điều này dành cho người dùng mới hoặc người dùng vô tình nhập dấu nhắc Python và không muốn biết đúng cú pháp. Họ có khả năng thử gõ exithoặc quit. Mặc dù điều này sẽ không thoát khỏi trình thông dịch, nhưng ít nhất nó sẽ đưa ra một thông báo cho họ biết lối thoát:

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

Đây thực chất chỉ là một bản hack sử dụng thực tế là trình thông dịch in ra __repr__bất kỳ biểu thức nào bạn nhập tại dấu nhắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.