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?

sundeep
sumber
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.

Dave Costa
sumber
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.

Eigir
sumber
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
nafsu birahi
sumber
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)
Oli
sumber
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.

Sam Corder
sumber
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.

FlipMcF
sumber
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 .

S.Lott
sumber
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.

lemahcamel
sumber
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)
phoenix
sumber
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.

Harper Shelby
sumber
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".

Davide
sumber
0

Mengikuti kode keluar unix 0 - untuk sukses / OK, 1 - tidak berhasil / kesalahan. Anda cukup menggunakan exit(0)atau exit(1)menelepon tanpa mengimpor sysmodul.

Lukasz Dynowski
sumber
-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.

vidstige
sumber
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