Keluar kode dengan Python


207

Saya mendapat pesan yang mengatakan script xyz.py returned exit code 0. Apa artinya ini?

Apa arti dari kode keluar di Python? Ada berapa banyak? Mana yang penting?


1
Di mana Anda melihat pesan ini?
Jeremy Cantrell

1
@ Jeremy Di bagian bawah PythonWin.
sundeep

Jawaban:


223

Apa yang Anda cari dalam skrip adalah panggilan untuk sys.exit(). Argumen untuk metode itu dikembalikan ke lingkungan sebagai kode keluar.

Kemungkinan besar script tidak pernah memanggil metode keluar, dan 0 adalah kode keluar default.


12
Tidak yakin sama sekali. Di Unix / Linux, standarnya adalah: keluar 0 jika semuanya baik-baik saja. Ketikkan perintah, lalu echo $ ?: jika Anda membaca 0, ia kembali tanpa kesalahan. Idenya adalah memiliki tes standar. Jika kode xyz.py tidak menemukan kesalahan, kode tersebut HARUS mengembalikan 0!
Bruno von Paris

1
Jika Anda ingin mengubah kode keluar, lebih memilih untuk keluar dengan bersih menggunakan pintu keluar bawaan, lihat jawaban ini
vidstige

101

Dari dokumentasi untuksys.exit :

Argumen argumen opsional dapat berupa bilangan bulat yang memberikan status keluar (default ke nol), atau jenis objek lainnya. Jika bilangan bulat, nol dianggap sebagai "penghentian sukses" dan nilai bukan nol dianggap "penghentian abnormal" oleh kerang dan sejenisnya. Sebagian besar sistem mengharuskannya berada dalam kisaran 0-127, dan menghasilkan hasil yang tidak ditentukan. Beberapa sistem memiliki konvensi untuk menetapkan makna khusus untuk kode keluar tertentu, tetapi ini umumnya kurang berkembang; Program Unix umumnya menggunakan 2 untuk kesalahan sintaks baris perintah dan 1 untuk semua jenis kesalahan lainnya.

Salah satu contoh di mana kode keluar digunakan dalam skrip shell. Dalam bash Anda dapat memeriksa variabel khusus $?untuk status keluar terakhir:

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

Secara pribadi saya mencoba menggunakan kode keluar yang saya temukan /usr/include/asm-generic/errno.h(pada sistem Linux), tetapi saya tidak tahu apakah ini hal yang benar untuk dilakukan.


3
Dari posting lain saya menemukan tautan ini: tldp.org/LDP/abs/html/exitcodes.html Mungkin bermanfaat. :)
Eigir

9
errno.h biasanya untuk kode keluar panggilan fungsi. Upaya untuk membakukan kode keluar program telah menghasilkan /usr/include/sysexits.h ada di sebagian besar sistem POSIX.
mpounsett

1
Sangat baik untuk mengetahui bahwa "Program Unix umumnya menggunakan 2 untuk kesalahan sintaks baris perintah"!
dantiston

2
@dantiston Concur. Die-hard dicelup-in-the-wool advokat Gentoo, namun saya tidak pernah tahu itu ... sampai hari ini ditakdirkan. ( Malu saya berakhir sekarang. ) Terkait, perhatikan bahwa grepistirahat tren ini dengan keluar dengan 1ketika tidak ada garis yang cocok dan 2pada kesalahan yang sebenarnya. Terima kasih banyak, Stallman.
Cecil Curry

32

Sebagai catatan, Anda dapat menggunakan kode keluar standar POSIX yang ditentukan sini .

Contoh:

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
Menurut dokumen ini hanya tersedia pada sistem operasi Unix sehingga tidak sepenuhnya portabel.
phoenix

1
Jika Anda ingin kode POSIX portabel yang tersedia di semua sistem operasi, lihat exitstatuspaket PyPI.
phoenix

1
Keseluruhan paket itu adalah 0 untuk sukses, dan 1 untuk kegagalan.
Pavel Minaev

25

Ada errnomodul yang mendefinisikan kode keluar standar:

Misalnya, Izin ditolak adalah kode kesalahan 13 :

import errno, sys

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

36
Ini salah. Kesalahan ini tidak dimaksudkan untuk digunakan sebagai kode proses keluar. Ini adalah kode kesalahan tingkat rendah yang dimaksudkan untuk digunakan secara internal dalam program, khususnya yang ditulis dalam bahasa C. Untuk Python, gunakan pengecualian bila memungkinkan.
SvdB

2
Kamu benar. Ini harus digunakan secara internal. Tetapi Anda biasanya tidak meningkatkan pengecualian di tingkat pengguna akhir. Anda menggunakan sys.exit (x) dengan x menjadi bilangan bulat yang Anda pilih secara sewenang-wenang. Tetapi Anda dapat menggunakan yang dimulai dengan EX_ dan didefinisikan dalam modul 'os'. Seperti os.EX_OK atau os.EX_IOERR
Oli

2
Maaf, tapi saya juga memilih ini karena itu menyesatkan. Keluar dari kode status dan nomor kesalahan tidak dapat dipertukarkan / saling melengkapi. Menggunakan contoh yang diberikan, "izin ditolak" memiliki kode kesalahan 13 (menurut errnodan errno.h ), tetapi kode status keluar dari 77 (menurut osdan sysexits.h ). Program yang memancarkan yang pertama adalah non-standar ( de facto vel jure ) dan tidak akan bermain dengan baik dengan orang lain yang benar mengharapkan yang terakhir.
Mark G.

14

Kode keluar 0 biasanya berarti, "tidak ada yang salah di sini." Namun, jika pemrogram naskah tidak mengikuti konvensi, Anda mungkin harus berkonsultasi dengan sumbernya untuk mengetahui artinya. Biasanya nilai yang bukan nol dikembalikan sebagai kode kesalahan.


6

Jawabannya adalah "Tergantung pada apa artinya kode keluar nol"

Namun, dalam kebanyakan kasus, ini berarti "Semuanya baik-baik saja"


Saya suka POSIX:

Jadi, pada shell, saya akan mengetik:

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

Jika skrip python saya memanggil sys.exit(0)shell mengembalikan 'OK'

Jika skrip python saya memanggil sys.exit(1)(atau bilangan bulat bukan nol), shell mengembalikan 'Not OK'

Tugas Anda untuk menjadi pintar dengan shell, dan membaca dokumentasi (atau sumber) untuk skrip Anda untuk melihat apa arti kode keluar.


Hanya untuk kelengkapan, 'Tidak OK' akan dicetak jika skrip Python menimbulkan kesalahan ATAU memiliki kesalahan sintaks.
Shital Shah

5

Perintah sistem operasi memiliki kode keluar. Cari kode keluar linux untuk melihat beberapa materi tentang ini. Shell menggunakan kode keluar untuk memutuskan apakah program bekerja, ada masalah, atau gagal. Ada beberapa upaya untuk membuat kode keluar standar (atau setidaknya yang umum digunakan). Lihat posting Advanced Shell Script ini .


5

Saya merekomendasikan shutdown bersih dengan jalan keluar (0) builtin daripada menggunakan sys.exit ()

Saya tidak yakin apakah ini saran yang bagus.

Dokumentasi yang disebutkan itu berbunyi:

Modul situs (yang diimpor secara otomatis selama startup, kecuali jika opsi -S command-line diberikan) menambahkan beberapa konstanta ke namespace built-in. Mereka berguna untuk shell interpreter interaktif dan tidak boleh digunakan dalam program .

Kemudian:

keluar (kode = Tidak Ada)

Objek yang ketika dicetak, mencetak pesan seperti "Gunakan berhenti () atau Ctrl-D (yaitu EOF) untuk keluar", dan ketika dipanggil, naikkan SystemExit dengan kode keluar yang ditentukan.

Jika kami membandingkannya dengan dokumentasi sys.exit () , ia menggunakan mekanisme yang sama yang meningkatkan SystemExitpengecualian.


5

Jika Anda ingin portable menggunakan kode keluar POSIX standar , lihatexitstatus paket di PyPI.

Instal paket:

$ pip install exitstatus

Gunakan dalam kode Anda:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

4

Kode keluar hanya memiliki makna sebagaimana ditugaskan oleh penulis skrip. Tradisi Unix adalah bahwa kode keluar 0 berarti 'sukses', yang lain adalah kegagalan. Satu-satunya cara untuk memastikan apa arti kode keluar untuk skrip yang diberikan adalah dengan memeriksa skrip itu sendiri.


2

Kode keluar dalam banyak bahasa pemrograman bergantung pada pemrogram. Jadi, Anda harus melihat kode sumber program (atau manual) Anda. Nol biasanya berarti "semuanya berjalan baik".



-2

Untuk memungkinkan penangan pengecualian dan hal-hal lain dijalankan, saya sarankan shutdown yang bersih dengan exit(0)builtin daripada menggunakan sys.exit()yang menghentikan proses secara tiba-tiba.


Jadi apa bedanya? Dari mana informasi ini berasal? Apakah yang Anda maksud adalah eksekusi penangan "saat keluar" atau apa yang sebenarnya Anda maksud? SystemExittampaknya dibesarkan dengan cara baik.
0xC0000022L

mm, saya bingung dengan os._exit, keduanya sepertinya naik SystemExit.
vidstige

1
Salah: sys.exit() tidak mematikan dengan benar, sama seperti exit(). Mereka berdua melakukan hal yang sama : mengajukan SystemExitpengecualian. Sebenarnya, exit()dimaksudkan untuk sesi interaktif, bukan skrip, jadi secara konseptual sys.exit() adalah yang ditunjukkan. Anda mungkin bingung dengan os._exit(), itu yang berakhir dengan tiba-tiba.
MestreLion
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.