Sự khác biệt giữa exit () và sys.exit () trong Python


409

Trong Python, có hai hàm được đặt tên tương tự exit()sys.exit(). Sự khác biệt là gì và khi nào tôi nên sử dụng cái này hơn cái kia?

Câu trả lời:


471

exitlà một trợ giúp cho vỏ tương tác - sys.exitđược thiết kế để sử dụng trong các chương trình.

Các sitemô-đun (được nhập khẩu tự động trong quá trình khởi động, trừ khi các -Stùy chọn dòng lệnh được đưa ra) cho biết thêm một vài hằng số để được xây dựng trong không gian tên (ví dụ exit) . Chúng rất hữu ích cho trình thông dịch tương tác và không nên được sử dụng trong các chương trình .


Về mặt kỹ thuật, họ làm hầu hết giống nhau: nuôi SystemExit. sys.exitlàm như vậy trong sysmodule.c :

static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
    PyObject *exit_code = 0;
    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
        return NULL;
    /* Raise SystemExit so callers may catch it or clean up. */
    PyErr_SetObject(PyExc_SystemExit, exit_code);
   return NULL;
}

While exitđược định nghĩa trong site.py_sitebuiltins.py , tương ứng.

class Quitter(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return 'Use %s() or %s to exit' % (self.name, eof)
    def __call__(self, code=None):
        # Shells like IDLE catch the SystemExit, but listen when their
        # stdin wrapper is closed.
        try:
            sys.stdin.close()
        except:
            pass
        raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')

Lưu ý rằng có một tùy chọn thoát thứ ba, cụ thể là os._exit , thoát ra mà không gọi trình xử lý dọn dẹp, xóa bộ đệm stdio, v.v. (và thường chỉ nên được sử dụng trong quy trình con sau a fork()).


4
Tôi nghi ngờ rằng exit (main ()) là một thành ngữ phổ biến vì mọi người không chọn không nên sử dụng trong ghi chú của chương trình . Nó hoạt động tốt trừ khi -Sđược sử dụng. Một cách để làm cho nó hoạt động ngay cả với -Slà chỉ định from sys import *.
tộc

5
@nobar, đúng, nhưng sau đó bạn không thực sự muốn sử dụng from module import *.
miku

@EvgeniSergeev, tôi không chắc chính xác những gì bạn đang hỏi? Nó có thể là một câu hỏi thú vị của riêng mình.
miku

Sẽ là một bổ sung tuyệt vời cho câu trả lời này để xem có vấn đề gì nếu có bất kỳ chức năng thoát nào trong ba chức năng thoát trong một "câu lệnh".
DevPlayer

32

Nếu tôi sử dụng exit()trong một mã và chạy nó trong trình bao, nó sẽ hiển thị một thông báo hỏi liệu tôi có muốn giết chương trình hay không. Nó thực sự đáng lo ngại. Xem tại đây

Nhưng sys.exit()là tốt hơn trong trường hợp này. Nó đóng chương trình và không tạo bất kỳ hộp thoại nào.


2
Điều này là do nó được thiết kế để sử dụng trong vỏ tương tác. Vì vậy, ngay cả khi bạn muốn hộp thoại, sys.exit()nên được sử dụng trong các chương trình.
TheTechRobo36414519
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.