รหัสออกใน Python


207

ฉันได้รับข้อความแจ้งว่า script xyz.py returned exit code 0ผมได้รับข้อความว่าสิ่งนี้หมายความว่า?

รหัสออกใน Python หมายความว่าอย่างไร มีกี่คน อันไหนสำคัญ?


1
คุณเห็นข้อความนี้อยู่ที่ไหน
Jeremy Cantrell

1
@ Jeremy ที่ด้านล่างของ PythonWin
sundeep

คำตอบ:


223

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

อาจเป็นไปได้ว่าสคริปต์ไม่เคยเรียกวิธีการออกและที่ 0 คือรหัสออกเริ่มต้น


12
ไม่แน่ใจเลย ใน Unix / Linux มาตรฐานคือ: exit 0 ในกรณีที่ทุกอย่างโอเค พิมพ์คำสั่งแล้ว echo $ ?: ถ้าคุณอ่าน 0 มันจะกลับมาโดยไม่มีข้อผิดพลาด ความคิดคือการมีการทดสอบมาตรฐาน หากรหัส xyz.py ไม่พบข้อผิดพลาด SHOULD จะคืนค่า 0!
Bruno von Paris

1
หากคุณต้องการเปลี่ยนรหัสออกโปรดออกโดยใช้ตัวออกอย่างสมบูรณ์โปรดดูคำตอบนี้
vidstige

101

จากเอกสารสำหรับsys.exit :

อาร์กิวเมนต์เผื่อเลือกสามารถเป็นจำนวนเต็มที่ให้สถานะการออก (ค่าเริ่มต้นเป็นศูนย์) หรือวัตถุชนิดอื่น หากเป็นจำนวนเต็มศูนย์จะถือว่า“ การสิ้นสุดที่สำเร็จ” และค่าที่ไม่ใช่ศูนย์ใด ๆ จะถือเป็น "การยกเลิกที่ผิดปกติ" โดยเชลล์และสิ่งที่คล้ายกัน ระบบส่วนใหญ่ต้องการให้อยู่ในช่วง 0-127 และให้ผลลัพธ์ที่ไม่ได้กำหนดไว้เป็นอย่างอื่น ระบบบางระบบมีระเบียบปฏิบัติสำหรับการกำหนดความหมายเฉพาะให้กับรหัสการออกที่เฉพาะเจาะจง แต่โดยทั่วไปจะมีการด้อยพัฒนา โดยทั่วไปแล้วโปรแกรม Unix จะใช้ 2 สำหรับข้อผิดพลาดทางไวยากรณ์บรรทัดคำสั่งและ 1 สำหรับข้อผิดพลาดชนิดอื่นทั้งหมด

ตัวอย่างหนึ่งที่ใช้รหัสทางออกอยู่ในเชลล์สคริปต์ ใน bash คุณสามารถตรวจสอบตัวแปรพิเศษ$?สำหรับสถานะทางออกสุดท้าย:

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

โดยส่วนตัวแล้วฉันพยายามใช้รหัสทางออกที่ฉันพบใน/usr/include/asm-generic/errno.h(บนระบบ Linux) แต่ฉันไม่รู้ว่านี่เป็นสิ่งที่ถูกต้องหรือไม่


3
จากโพสต์อื่นฉันพบลิงค์นี้: tldp.org/LDP/abs/html/exitcodes.html อาจเป็นประโยชน์ :)
Eigir

9
errno.h มักใช้สำหรับรหัสออกจากการเรียกใช้ฟังก์ชัน ความพยายามในการสร้างมาตรฐานรหัสออกจากโปรแกรมทำให้ /usr/include/sysexits.h ปรากฏอยู่ในระบบ POSIX ส่วนใหญ่
mpounsett

1
เป็นเรื่องที่ดีมากที่รู้ว่า "โปรแกรม Unix โดยทั่วไปใช้ 2 สำหรับข้อผิดพลาดทางไวยากรณ์บรรทัดคำสั่ง"!
dantiston

2
เห็นด้วย @dantiston ผู้สนับสนุน Gentoo ย้อมสีด้วยความตาย แต่ฉันไม่เคยรู้เลยว่า ... จนถึงวันที่โชคชะตานี้ ( ความอัปยศของฉันสิ้นสุดลงแล้วในขณะนี้ ) โปรดทราบว่าgrepสิ่งนี้จะทำให้เทรนด์นี้แตกตัวโดยออก1เมื่อไม่มีบรรทัดที่ตรงกันและ2เกิดข้อผิดพลาดจริง ขอบคุณมากสตอลแมน
เซซิลแกงกะหรี่

32

สำหรับบันทึกที่คุณสามารถใช้ POSIX รหัสออกมาตรฐานที่กำหนดไว้ที่นี่

ตัวอย่าง:

import sys, os

try:
    config()
except:
    sys.exit(os.EX_CONFIG) 
try:
    do_stuff()
except:
    sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok

3
ตามเอกสารเหล่านี้มีอยู่ในระบบปฏิบัติการ Unix เท่านั้นดังนั้นจึงไม่สามารถพกพาได้อย่างสมบูรณ์
ฟีนิกซ์

1
หากคุณต้องการรหัส POSIX แบบพกพาที่มีอยู่ในทุกระบบปฏิบัติการให้ดูexitstatusแพ็คเกจ PyPI
ฟีนิกซ์

1
แพคเกจทั้งหมดนั้นคือ 0 เพื่อความสำเร็จและ 1 สำหรับความล้มเหลว
Pavel Minaev

25

มี errnoโมดูลที่กำหนดรหัสทางออกมาตรฐาน:

ตัวอย่างเช่นการอนุญาตที่ถูกปฏิเสธคือรหัสข้อผิดพลาด13 :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

36
สิ่งนี้ไม่ถูกต้อง errno เหล่านี้ไม่ได้มีวัตถุประสงค์เพื่อใช้เป็นรหัสออกจากกระบวนการ รหัสข้อผิดพลาดระดับต่ำเหล่านี้มีวัตถุประสงค์เพื่อใช้ภายในโปรแกรมโดยเฉพาะอย่างยิ่งรหัสที่เขียนด้วยภาษา C สำหรับ Python ให้ใช้ข้อยกเว้นทุกครั้งที่ทำได้
SvdB

2
คุณถูก. สิ่งเหล่านี้จะถูกใช้ภายใน แต่โดยปกติคุณจะไม่เพิ่มข้อยกเว้นในระดับผู้ใช้ คุณใช้ sys.exit (x) โดย x เป็นจำนวนเต็มที่คุณเลือกเอง แต่คุณสามารถใช้สิ่งที่เริ่มต้นด้วย EX_ และกำหนดไว้ในโมดูล 'os' เช่น os.EX_OK หรือ os.EX_IOERR
Oli

2
ขออภัย แต่ฉันก็ลงคะแนนเช่นนี้เพราะมันทำให้เข้าใจผิด รหัสสถานะการออกและหมายเลขข้อผิดพลาดไม่สามารถเปลี่ยนได้ / เสริม การใช้ตัวอย่างที่กำหนด“ สิทธิ์ถูกปฏิเสธ” มีรหัสข้อผิดพลาด 13 (ตามerrnoและerrno.h ) แต่รหัสสถานะการออก 77 (ตามosและsysexits.h ) รายการที่ปล่อยออกมาก่อนหน้านี้ไม่ได้มาตรฐาน ( โดยแท้จริงแล้วเป็นทางเลือก ) และจะไม่เล่นกับผู้อื่นอย่างที่คาดหวังไว้อย่างหลัง
Mark G.

14

รหัสการออกของ 0 มักจะหมายถึง "ไม่มีอะไรผิดปกติที่นี่" อย่างไรก็ตามหากโปรแกรมเมอร์ของสคริปต์ไม่ทำตามแบบแผนคุณอาจต้องปรึกษาแหล่งข้อมูลเพื่อดูความหมายของมัน โดยปกติแล้วค่าที่ไม่ใช่ศูนย์จะถูกส่งคืนเป็นรหัสข้อผิดพลาด


6

คำตอบคือ "ขึ้นอยู่กับสิ่งที่รหัสทางออกศูนย์หมายถึง"

อย่างไรก็ตามในกรณีส่วนใหญ่หมายถึง "ทุกอย่างก็โอเค"


ฉันชอบ POSIX:

ดังนั้นบนเชลล์ฉันจะพิมพ์:

python script.py && echo 'OK' || echo 'Not OK'

ถ้าสคริปต์ของฉันหลามโทร sys.exit(0)เชลล์ส่งคืน 'ตกลง'

ถ้าสคริปต์ของฉันหลามโทร sys.exit(1) (หรือเลขจำนวนเต็มใด ๆ ที่ไม่ใช่ศูนย์) เชลล์จะส่งคืน 'Not OK'

เป็นหน้าที่ของคุณในการทำความเข้าใจกับเชลล์และอ่านเอกสารประกอบ (หรือที่มา) เพื่อให้สคริปต์ของคุณเห็นความหมายของรหัสทางออก


เพื่อความสมบูรณ์ 'จะไม่ตกลง' จะถูกพิมพ์หากสคริปต์ Python ยกข้อผิดพลาดหรือมีข้อผิดพลาดทางไวยากรณ์
Shital Shah

5

คำสั่งระบบปฏิบัติการมีรหัสออก มองหารหัสทางออกของ linuxเพื่อดูเนื้อหาบางอย่างเกี่ยวกับเรื่องนี้ เชลล์ใช้รหัสออกเพื่อตัดสินใจว่าโปรแกรมทำงานมีปัญหาหรือล้มเหลว มีความพยายามในการสร้างรหัสออกมาตรฐาน (หรืออย่างน้อยที่ใช้กันทั่วไป) เป็นรหัสออก ดูโพสต์เชลล์สคริปต์ขั้นสูงนี้


5

ฉันขอแนะนำให้ปิดระบบแบบใหม่โดยใช้ builtin exit (0) แทนที่จะใช้ sys.exit ()

ฉันไม่แน่ใจว่านี่เป็นคำแนะนำที่ดีหรือไม่

เอกสารที่กล่าวถึงมากอ่าน:

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

แล้ว:

ออก (รหัส = ไม่มี)

วัตถุที่เมื่อพิมพ์ให้พิมพ์ข้อความเช่น“ Use quit () หรือ Ctrl-D (เช่น EOF) เพื่อออก” และเมื่อถูกเรียกให้ยก SystemExit ด้วยรหัสการออกที่ระบุ

หากเราเปรียบเทียบกับเอกสารsys.exit () แสดงว่ามันใช้กลไกเดียวกับที่ยกSystemExitข้อยกเว้น



4

รหัสออกมีความหมายตามที่ได้รับมอบหมายจากผู้เขียนสคริปต์เท่านั้น ประเพณี Unix คือรหัสทางออก 0 หมายถึง 'ความสำเร็จ' สิ่งอื่นใดคือความล้มเหลว วิธีเดียวที่จะตรวจสอบว่ารหัสทางออกสำหรับสคริปต์ที่กำหนดนั้นคือการตรวจสอบสคริปต์เอง


2

รหัสการออกในภาษาการเขียนโปรแกรมจำนวนมากขึ้นอยู่กับโปรแกรมเมอร์ ดังนั้นคุณต้องดูซอร์สโค้ดโปรแกรมของคุณ (หรือด้วยตนเอง) ศูนย์มักจะหมายถึง "ทุกอย่างไปได้ดี"


-2

เพื่อให้ตัวจัดการข้อยกเว้นและสิ่งอื่น ๆ ดำเนินการฉันขอแนะนำให้ปิดระบบใหม่ทั้งหมดด้วยexit(0)builtin แทนที่จะใช้sys.exit()ซึ่งยุติกระบวนการอย่างกะทันหัน


ความแตกต่างคืออะไร? ข้อมูลนี้มาจากไหน คุณหมายถึงการทำงานของตัวจัดการ "at exit" หรือคุณหมายถึงอะไรกันแน่? SystemExitดูเหมือนจะได้รับการยกวิธีใด
0xC0000022L

มมผมสับสนกับที่ทั้งสองดูเหมือนว่าจะเพิ่มขึ้นos._exit SystemExit
vidstige

1
ผิด: sys.exit() ไม่exit()ปิดเรียบร้อยเช่นเดียวกับ พวกเขาทั้งสองทำสิ่งเดียวกัน : ยกSystemExitข้อยกเว้น ที่จริงแล้วexit()มีไว้สำหรับเซสชันแบบโต้ตอบไม่ใช่สคริปต์ดังนั้นแนวคิดจึงsys.exit() เป็นสิ่งที่ระบุ คุณอาจสับสนos._exit()ว่าเป็นสิ่งที่ยุติทันที
MestreLion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.