Tôi nhận được một tin nhắn nói script xyz.py returned exit code 0
. Điều đó có nghĩa là gì?
Mã thoát trong Python có nghĩa là gì? Có bao nhiêu cái Những cái nào là quan trọng?
Tôi nhận được một tin nhắn nói script xyz.py returned exit code 0
. Điều đó có nghĩa là gì?
Mã thoát trong Python có nghĩa là gì? Có bao nhiêu cái Những cái nào là quan trọng?
Câu trả lời:
Những gì bạn đang tìm kiếm trong kịch bản là các cuộc gọi đến sys.exit()
. Đối số cho phương thức đó được trả về môi trường dưới dạng mã thoát.
Rất có khả năng tập lệnh không bao giờ gọi phương thức thoát và 0 là mã thoát mặc định.
Từ tài liệu chosys.exit
:
Đối số tùy chọn arg có thể là một số nguyên cho trạng thái thoát (mặc định là 0) hoặc một loại đối tượng khác. Nếu nó là một số nguyên, số 0 được coi là chấm dứt thành công và bất kỳ giá trị khác nào được coi là chấm dứt bất thường bởi các vỏ và tương tự. Hầu hết các hệ thống yêu cầu nó phải nằm trong phạm vi 0-127 và tạo ra kết quả không xác định theo cách khác. Một số hệ thống có một quy ước để gán ý nghĩa cụ thể cho các mã thoát cụ thể, nhưng chúng thường không được phát triển; Các chương trình Unix thường sử dụng 2 cho các lỗi cú pháp dòng lệnh và 1 cho tất cả các loại lỗi khác.
Một ví dụ trong đó mã thoát được sử dụng là trong các kịch bản shell. Trong bash, bạn có thể kiểm tra biến đặc biệt $?
cho trạng thái thoát cuối cùng:
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
Cá nhân tôi cố gắng sử dụng mã thoát mà tôi tìm thấy /usr/include/asm-generic/errno.h
(trên hệ thống Linux), nhưng tôi không biết liệu đây có phải là điều đúng hay không.
grep
phá vỡ xu hướng này bằng cách thoát ra 1
khi không có dòng nào khớp và 2
trên các lỗi thực tế. Cảm ơn rất nhiều, Stallman.
Đối với bản ghi, bạn có thể sử dụng mã thoát chuẩn POSIX được xác định tại đây .
Thí dụ:
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
gói PyPI.
Có một errno
mô-đun xác định mã thoát tiêu chuẩn:
Ví dụ: Quyền bị từ chối là mã lỗi 13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
và errno.h ), nhưng mã trạng thái thoát là 77 (theo os
và sysexits.h ). Các chương trình phát ra cái trước là không chuẩn ( de facto vel jure ) và sẽ không chơi tốt với những cái khác mong đợi cái sau.
Mã thoát 0 thường có nghĩa là "không có gì sai ở đây." Tuy nhiên, nếu lập trình viên của kịch bản không tuân theo quy ước, bạn có thể phải tham khảo nguồn để xem ý nghĩa của nó. Thông thường giá trị khác không được trả về dưới dạng mã lỗi.
Câu trả lời là "Phụ thuộc vào ý nghĩa của mã thoát"
Tuy nhiên, trong hầu hết các trường hợp, điều này có nghĩa là "Mọi thứ đều ổn"
Tôi thích POSIX:
Vì vậy, trên vỏ, tôi sẽ gõ:
python script.py && echo 'OK' || echo 'Not OK'
Nếu kịch bản python của tôi gọi sys.exit(0)
shell trả về 'OK'
Nếu tập lệnh python của tôi gọi sys.exit(1)
(hoặc bất kỳ số nguyên khác không), shell trả về 'Không ổn'
Công việc của bạn là phải thông minh với trình bao và đọc tài liệu (hoặc nguồn) cho tập lệnh của bạn để xem mã thoát có nghĩa là gì.
Các lệnh hệ điều hành có mã thoát. Hãy tìm mã thoát linux để xem một số tài liệu về điều này. Shell sử dụng mã thoát để quyết định xem chương trình có hoạt động không, có vấn đề hay không. Có một số nỗ lực để tạo mã thoát tiêu chuẩn (hoặc ít nhất là thường được sử dụng). Xem bài đăng Advanced Shell Script này .
Nếu bạn muốn sử dụng mã thoát POSIX tiêu chuẩn , hãy xem exitstatus
gói trên PyPI.
Cài đặt gói:
$ pip install exitstatus
Sử dụng trong mã của bạn:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
Các mã thoát chỉ có ý nghĩa theo sự phân công của tác giả kịch bản. Truyền thống Unix là mã thoát 0 có nghĩa là 'thành công', bất cứ điều gì khác là thất bại. Cách duy nhất để chắc chắn mã thoát cho một tập lệnh đã cho là gì để kiểm tra chính tập lệnh đó.
Tôi khuyên bạn nên tắt máy sạch với lối ra (0) dựng sẵn thay vì sử dụng sys.exit ()
Tôi không chắc đây có phải là lời khuyên tốt không.
Các tài liệu rất được đề cập đọc:
Mô-đun trang web (được nhập tự động trong khi khởi động, ngoại trừ nếu tùy chọn dòng lệnh -S được cung cấp) thêm một số hằng vào không gian tên tích hợp. 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 .
Sau đó:
thoát (mã = Không có)
Các đối tượng mà khi được in, hãy in một thông báo như sử dụng Thoát () hoặc Ctrl-D (tức là EOF) để thoát ra, và khi được gọi, hãy nâng SystemExit bằng mã thoát được chỉ định.
Nếu chúng ta so sánh nó với tài liệu sys.exit () , thì nó sử dụng cùng một cơ chế tạo ra một SystemExit
ngoại lệ.
Để cho phép các trình xử lý ngoại lệ và các thứ khác thực thi, tôi khuyên bạn nên tắt máy với phần exit(0)
dựng sẵn thay vì sử dụng sys.exit()
làm chấm dứt quá trình đột ngột.
SystemExit
xuất hiện để được nâng lên một trong hai cách.
os._exit
, cả hai dường như tăng lên SystemExit
.
sys.exit()
không tắt máy sạch sẽ, giống như exit()
. Cả hai đều làm cùng một điều: nêu ra một SystemExit
ngoại lệ. Trên thực tế, exit()
có nghĩa là cho các phiên tương tác, không phải các kịch bản, vì vậy về mặt khái niệm sys.exit()
là chỉ định. Bạn có thể nhầm lẫn với os._exit()
, đó là một trong đó chấm dứt đột ngột.