คำสั่ง Python exit - ทำไมจึงควรใช้หลายคำสั่งเมื่อใด?


489

ดูเหมือนว่างูใหญ่สนับสนุนคำสั่งต่าง ๆ มากมายเพื่อหยุดการทำงานของสคริปต์
ตัวเลือกที่ฉันได้พบคือ: 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 quitหลังจากที่ทุกหนึ่งในสิ่งที่มีแนวโน้มมากที่สุดเป็นมือใหม่จะพยายามที่จะออกจากงูหลามเป็นพิมพ์ใน

    อย่างไรก็ตามไม่quitควรใช้ในรหัสการผลิต นี่เป็นเพราะมันใช้งานได้เฉพาะเมื่อโหลดโมดูล ควรใช้ฟังก์ชันนี้ในล่ามเท่านั้นsite

  2. exit()เป็นนามแฝงสำหรับquit(หรือในทางกลับกัน) พวกมันอยู่ด้วยกันเพียงเพื่อให้งูใหญ่ใช้งานง่ายขึ้น

    นอกจากนี้มันยังให้ข้อความเมื่อพิมพ์:

    >>> 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 ฯลฯ ดังนั้นจึงไม่ใช่วิธีมาตรฐานในการออกและควรใช้ในกรณีพิเศษเท่านั้น ที่พบมากที่สุดของเหล่านี้อยู่ในกระบวนการเด็ก (e) os.forkที่สร้างขึ้นโดย

    โปรดทราบว่าจากสี่วิธีที่ระบุมีเพียงวิธีนี้เท่านั้นที่ไม่ซ้ำกันในสิ่งที่ทำ

โดยสรุปแล้วทั้งสี่วิธีจะออกจากโปรแกรม อย่างไรก็ตามทั้งสองครั้งแรกถือว่าไม่ถูกต้องที่จะใช้ในรหัสการผลิตและสุดท้ายคือวิธีที่ไม่ได้มาตรฐานและสกปรกที่ใช้เฉพาะในสถานการณ์พิเศษ sys.exitดังนั้นถ้าคุณต้องการที่จะออกจากโปรแกรมปกติไปกับวิธีที่สาม:


หรือในความคิดของฉันที่ดียิ่งขึ้นคุณสามารถทำสิ่งที่sys.exitอยู่เบื้องหลังและดำเนินการโดยตรง:

raise SystemExit

ด้วยวิธีนี้คุณไม่จำเป็นต้องนำเข้าsysก่อน

อย่างไรก็ตามตัวเลือกนี้เป็นเพียงหนึ่งในสไตล์และขึ้นอยู่กับคุณอย่างหมดจด


2
แต่ใน ipython shell quitและexitออกจาก shell ในขณะที่sys.exitทำไม่ได้
Lee

5
sys.exit()ไม่ใช่วิธีการปิดที่เชื่อถือได้ หากมีการเรียกใช้ภายในเธรดจะเป็นการยกเลิกเฉพาะเธรดนั้นเว้นแต่ว่าอยู่ในเธรดหลัก สิ่งนี้สามารถนำไปสู่หลายกรณีที่โปรแกรมดำเนินการต่อเนื่องจากการโทรไม่ได้อยู่ในเธรดหลัก
Elliot

1
การลงคะแนนเสียงผมสำหรับการเพิ่มคำสั่งที่จะend raise SystemExitอย่าดูว่าทำไมไม่มีอะไรง่าย ๆ แบบนี้เหมือนใน BASIC
Brian Burns

6
@BrianBurns: มันไม่คุ้มค่าที่จะเพิ่มไวยากรณ์เฉพาะและสำรองคำหลักอื่น นี่คล้ายกับสาเหตุที่printเปลี่ยนจากคำสั่งเป็นฟังก์ชั่น ง่ายต่อการเพิ่มไวยากรณ์ แต่มีความซับซ้อนในการทำเช่นนั้น
user2357112 รองรับ Monica

1
เครื่องหมายวงเล็บสำคัญเมื่อโทรsys.exit()หรือไม่?
Linde

99

ฟังก์ชั่น* quit() , exit()และsys.exit()ฟังก์ชั่นในลักษณะเดียวกัน: พวกเขายกSystemExitข้อยกเว้น ดังนั้นจึงไม่มีความแตกต่างกันจริงยกเว้นว่าsys.exit()อยู่เสมอ แต่exit()และquit()จะมีให้เฉพาะถ้าsiteโมดูลจะถูกนำเข้า

os._exit()ฟังก์ชั่นพิเศษก็ออกทันทีโดยไม่มีการเรียกฟังก์ชั่นการทำความสะอาดใด ๆ (มันไม่บัฟเฟอร์ไม่ล้างตัวอย่าง) นี้ถูกออกแบบมาสำหรับกรณีการใช้งานที่มีความเชี่ยวชาญสูง ... โดยทั่วไปเฉพาะในเด็กหลังจากการos.fork()โทร

ข้อสรุป

  • ใช้exit()หรือquit()ใน REPL

  • ใช้sys.exit()ในสคริปต์หรือraise SystemExit()หากคุณต้องการ

  • ใช้สำหรับกระบวนการที่เด็กเพื่อออกหลังจากที่โทรไปos._exit()os.fork()

สิ่งเหล่านี้สามารถเรียกได้โดยไม่มีข้อโต้แย้งหรือคุณสามารถระบุสถานะการออกเช่นexit(1)หรือraise SystemExit(1)เพื่อออกด้วยสถานะ 1 โปรดทราบว่าโปรแกรมแบบพกพาถูก จำกัด ไว้ที่รหัสสถานะการออกในช่วง 0-255 หากคุณraise SystemExit(256)ใช้ระบบหลายระบบ รับการตัดทอนและกระบวนการของคุณจะออกจากจริงด้วยสถานะ 0

เชิงอรรถ

*จริงquit()และexit()เป็นวัตถุเช่น callable แต่ฉันคิดว่ามันโอเคที่จะเรียกใช้ฟังก์ชันพวกเขา


50

วิธีการออกที่แตกต่างกัน

os._exit():

  • ออกจากกระบวนการโดยไม่เรียกตัวจัดการการล้างข้อมูล

exit(0):

  • การออกใหม่ทั้งหมดโดยไม่มีข้อผิดพลาด / ปัญหา

exit(1):

  • มีปัญหา / ข้อผิดพลาด / ปัญหาอยู่และนั่นคือสาเหตุที่โปรแกรมออก

sys.exit():

  • เมื่อระบบและ python ปิดตัวลง หมายความว่ามีการใช้หน่วยความจำน้อยลงหลังจากเรียกใช้โปรแกรม

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__แสดงออกใด ๆ ที่คุณป้อนที่พรอมต์

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