ความแตกต่างระหว่าง exit () และ sys.exit () ใน Python


409

ในหลามมีสองฟังก์ชั่นในทำนองเดียวกันการตั้งชื่อและexit() sys.exit()อะไรคือความแตกต่างและเมื่อใดที่ฉันควรใช้อันอื่น?

คำตอบ:


471

exitเป็นผู้ช่วยสำหรับเชลล์แบบโต้ตอบ - sys.exitมีไว้สำหรับใช้ในโปรแกรม

siteโมดูล (ซึ่งนำเข้าโดยอัตโนมัติระหว่างการเริ่มต้นยกเว้นถ้า-Sตัวเลือกบรรทัดคำสั่งจะได้รับ) เพิ่ม constant หลาย ๆ ไปในตัว namespace (เช่นexit ) พวกเขาจะมีประโยชน์สำหรับเปลือกล่ามโต้ตอบและไม่ควรนำมาใช้ในโปรแกรม


เทคนิคที่พวกเขาทำส่วนใหญ่เหมือนกัน: SystemExitการเพิ่ม sys.exitทำเช่นนั้นใน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;
}

ขณะที่exitถูกกำหนดในsite.pyและ_sitebuiltins.pyตามลำดับ

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')

โปรดทราบว่ามีตัวเลือกทางออกที่สามคือos._exitซึ่งออกโดยไม่เรียกใช้ตัวจัดการการล้างการล้างบัฟเฟอร์ stdio ฯลฯ (และควรใช้ในกระบวนการย่อยหลังจาก a fork()) เท่านั้น


4
ฉันสงสัยว่าออก (main ()) เป็นสำนวนที่พบบ่อยเพราะคนที่ไม่ได้รับในไม่ควรนำมาใช้ในโปรแกรมบันทึก มันทำงานได้ดีเว้นแต่-Sจะใช้ วิธีที่จะทำให้การทำงานแม้จะมีคือการระบุ-S from sys import *
สูงศักดิ์

5
@nobar จริง แต่คุณไม่ต้องการใช้from module import *จริงๆ
miku

@EvgeniSergeev ฉันไม่แน่ใจว่าสิ่งที่คุณถามอย่างแน่นอน? มันอาจเป็นคำถามที่น่าสนใจด้วยตัวเอง
miku

มันจะเป็นการเพิ่มคำตอบนี้ให้ดีเพื่อดูว่ามีปัญหาอะไรบ้างในการใช้ฟังก์ชั่น exit ทั้งสามใน "with statement"
DevPlayer

32

ถ้าฉันใช้exit()ในรหัสและเรียกใช้ในเชลล์มันจะแสดงข้อความถามว่าฉันต้องการที่จะฆ่าโปรแกรมหรือไม่ มันน่ารำคาญจริงๆ ดูที่นี่

แต่sys.exit()จะดีกว่าในกรณีนี้ มันปิดโปรแกรมและไม่ได้สร้างกล่องโต้ตอบใด ๆ


2
นี่เป็นเพราะมันถูกออกแบบมาเพื่อใช้ในเปลือกโต้ตอบ ดังนั้นแม้ว่าคุณต้องการโต้ตอบsys.exit()ควรใช้ภายในโปรแกรม
TheTechRobo36414519
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.