ฉันได้รับข้อความแจ้งว่า script xyz.py returned exit code 0
ผมได้รับข้อความว่าสิ่งนี้หมายความว่า?
รหัสออกใน Python หมายความว่าอย่างไร มีกี่คน อันไหนสำคัญ?
ฉันได้รับข้อความแจ้งว่า script xyz.py returned exit code 0
ผมได้รับข้อความว่าสิ่งนี้หมายความว่า?
รหัสออกใน Python หมายความว่าอย่างไร มีกี่คน อันไหนสำคัญ?
คำตอบ:
sys.exit()
สิ่งที่คุณกำลังมองหาในสคริปต์โทรไป อาร์กิวเมนต์ของวิธีนั้นจะถูกส่งคืนไปยังสภาพแวดล้อมเป็นรหัสออก
อาจเป็นไปได้ว่าสคริปต์ไม่เคยเรียกวิธีการออกและที่ 0 คือรหัสออกเริ่มต้น
จากเอกสารสำหรับ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) แต่ฉันไม่รู้ว่านี่เป็นสิ่งที่ถูกต้องหรือไม่
grep
สิ่งนี้จะทำให้เทรนด์นี้แตกตัวโดยออก1
เมื่อไม่มีบรรทัดที่ตรงกันและ2
เกิดข้อผิดพลาดจริง ขอบคุณมากสตอลแมน
สำหรับบันทึกที่คุณสามารถใช้ 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
exitstatus
แพ็คเกจ PyPI
มี errno
โมดูลที่กำหนดรหัสทางออกมาตรฐาน:
ตัวอย่างเช่นการอนุญาตที่ถูกปฏิเสธคือรหัสข้อผิดพลาด13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
และerrno.h ) แต่รหัสสถานะการออก 77 (ตามos
และsysexits.h ) รายการที่ปล่อยออกมาก่อนหน้านี้ไม่ได้มาตรฐาน ( โดยแท้จริงแล้วเป็นทางเลือก ) และจะไม่เล่นกับผู้อื่นอย่างที่คาดหวังไว้อย่างหลัง
รหัสการออกของ 0 มักจะหมายถึง "ไม่มีอะไรผิดปกติที่นี่" อย่างไรก็ตามหากโปรแกรมเมอร์ของสคริปต์ไม่ทำตามแบบแผนคุณอาจต้องปรึกษาแหล่งข้อมูลเพื่อดูความหมายของมัน โดยปกติแล้วค่าที่ไม่ใช่ศูนย์จะถูกส่งคืนเป็นรหัสข้อผิดพลาด
คำตอบคือ "ขึ้นอยู่กับสิ่งที่รหัสทางออกศูนย์หมายถึง"
อย่างไรก็ตามในกรณีส่วนใหญ่หมายถึง "ทุกอย่างก็โอเค"
ฉันชอบ POSIX:
ดังนั้นบนเชลล์ฉันจะพิมพ์:
python script.py && echo 'OK' || echo 'Not OK'
ถ้าสคริปต์ของฉันหลามโทร sys.exit(0)
เชลล์ส่งคืน 'ตกลง'
ถ้าสคริปต์ของฉันหลามโทร sys.exit(1)
(หรือเลขจำนวนเต็มใด ๆ ที่ไม่ใช่ศูนย์) เชลล์จะส่งคืน 'Not OK'
เป็นหน้าที่ของคุณในการทำความเข้าใจกับเชลล์และอ่านเอกสารประกอบ (หรือที่มา) เพื่อให้สคริปต์ของคุณเห็นความหมายของรหัสทางออก
คำสั่งระบบปฏิบัติการมีรหัสออก มองหารหัสทางออกของ linuxเพื่อดูเนื้อหาบางอย่างเกี่ยวกับเรื่องนี้ เชลล์ใช้รหัสออกเพื่อตัดสินใจว่าโปรแกรมทำงานมีปัญหาหรือล้มเหลว มีความพยายามในการสร้างรหัสออกมาตรฐาน (หรืออย่างน้อยที่ใช้กันทั่วไป) เป็นรหัสออก ดูโพสต์เชลล์สคริปต์ขั้นสูงนี้
ฉันขอแนะนำให้ปิดระบบแบบใหม่โดยใช้ builtin exit (0) แทนที่จะใช้ sys.exit ()
ฉันไม่แน่ใจว่านี่เป็นคำแนะนำที่ดีหรือไม่
เอกสารที่กล่าวถึงมากอ่าน:
โมดูลไซต์ (ซึ่งนำเข้าโดยอัตโนมัติระหว่างการเริ่มต้นยกเว้นถ้ากำหนดตัวเลือกบรรทัดคำสั่ง -S) จะเพิ่มค่าคงที่หลายรายการให้กับเนมสเปซในตัว พวกเขาจะมีประโยชน์สำหรับเปลือกล่ามโต้ตอบและไม่ควรนำมาใช้ในโปรแกรม
แล้ว:
ออก (รหัส = ไม่มี)
วัตถุที่เมื่อพิมพ์ให้พิมพ์ข้อความเช่น“ Use quit () หรือ Ctrl-D (เช่น EOF) เพื่อออก” และเมื่อถูกเรียกให้ยก SystemExit ด้วยรหัสการออกที่ระบุ
หากเราเปรียบเทียบกับเอกสารsys.exit () แสดงว่ามันใช้กลไกเดียวกับที่ยกSystemExit
ข้อยกเว้น
หากคุณต้องการใช้รหัสทางออก POSIX แบบพกพาดูที่exitstatus
พกพาแพ็คเกจบน PyPI
ติดตั้งแพ็คเกจ:
$ pip install exitstatus
ใช้ในรหัสของคุณ:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
รหัสออกมีความหมายตามที่ได้รับมอบหมายจากผู้เขียนสคริปต์เท่านั้น ประเพณี Unix คือรหัสทางออก 0 หมายถึง 'ความสำเร็จ' สิ่งอื่นใดคือความล้มเหลว วิธีเดียวที่จะตรวจสอบว่ารหัสทางออกสำหรับสคริปต์ที่กำหนดนั้นคือการตรวจสอบสคริปต์เอง
รหัสการออกในภาษาการเขียนโปรแกรมจำนวนมากขึ้นอยู่กับโปรแกรมเมอร์ ดังนั้นคุณต้องดูซอร์สโค้ดโปรแกรมของคุณ (หรือด้วยตนเอง) ศูนย์มักจะหมายถึง "ทุกอย่างไปได้ดี"
เพื่อให้ตัวจัดการข้อยกเว้นและสิ่งอื่น ๆ ดำเนินการฉันขอแนะนำให้ปิดระบบใหม่ทั้งหมดด้วยexit(0)
builtin แทนที่จะใช้sys.exit()
ซึ่งยุติกระบวนการอย่างกะทันหัน
SystemExit
ดูเหมือนจะได้รับการยกวิธีใด
os._exit
SystemExit
sys.exit()
ไม่exit()
ปิดเรียบร้อยเช่นเดียวกับ พวกเขาทั้งสองทำสิ่งเดียวกัน : ยกSystemExit
ข้อยกเว้น ที่จริงแล้วexit()
มีไว้สำหรับเซสชันแบบโต้ตอบไม่ใช่สคริปต์ดังนั้นแนวคิดจึงsys.exit()
เป็นสิ่งที่ระบุ คุณอาจสับสนos._exit()
ว่าเป็นสิ่งที่ยุติทันที