Python'da çıkış kodları


207

Bir mesaj aldım script xyz.py returned exit code 0. Ne anlama geliyor?

Python'daki çıkış kodları ne anlama geliyor? Kaç tane var? Hangileri önemlidir?


1
Bu mesajı nerede görüyorsun?
Jeremy Cantrell

1
@Jeremy PythonWin'in altında.
sundeep

Yanıtlar:


223

Senaryoda aradığınız şey çağrıdır sys.exit(). Bu yöntemin bağımsız değişkeni, çıkış kodu olarak ortama döndürülür.

Komut dosyasının hiçbir zaman çıkış yöntemini çağırmaması oldukça olasıdır ve 0 varsayılan çıkış kodudur.


12
Hiç emin değilim. Unix / Linux'ta standart şudur: her şeyin yolunda olması durumunda 0'dan çıkın. Bir komut yazın, sonra $ ?: 0 okursanız, hatasız döndü. Fikir standart testlere sahip olmaktır. Xyz.py kodu herhangi bir hatayla karşılaşmazsa, 0 döndürmelidir!
Bruno von Paris

1
Çıkış kodunu değiştirmek isterseniz, çıkış
yerleşimini

101

İçin belgelerdensys.exit :

İsteğe bağlı argüman, çıkış durumunu (varsayılan olarak sıfıra) veren bir tam sayı veya başka bir nesne türü olabilir. Bir tamsayı ise, sıfır “başarılı sonlandırma” olarak kabul edilir ve sıfır olmayan herhangi bir değer, kabuklar ve benzerleri tarafından “anormal sonlandırma” olarak kabul edilir. Çoğu sistem 0-127 aralığında olmasını ve aksi halde tanımlanmamış sonuçlar üretmesini gerektirir. Bazı sistemler, belirli çıkış kodlarına belirli anlamlar atamak için bir kurala sahiptir, ancak bunlar genellikle az gelişmiştir; Unix programları genellikle komut satırı sözdizimi hataları için 2 ve diğer tüm hata türleri için 1 kullanır.

Çıkış kodlarının kullanıldığı bir örnek kabuk komut dosyalarındadır. Bash'da $?son çıkış durumu için özel değişkeni kontrol edebilirsiniz :

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

Şahsen bulduğum çıkış kodlarını /usr/include/asm-generic/errno.h(bir Linux sisteminde) kullanmaya çalışıyorum, ama bunun doğru bir şey olup olmadığını bilmiyorum.


3
Başka bir gönderiden bu bağlantıyı buldum: tldp.org/LDP/abs/html/exitcodes.html Yararlı olabilir. :)
Eigir

9
errno.h genellikle işlev çağrısı çıkış kodları içindir. Program çıkış kodlarını standartlaştırma girişimleri, çoğu POSIX sisteminde /usr/include/sysexits.h bulunmasına neden oldu.
mpounsett

1
"Unix programlarının genellikle komut satırı sözdizimi hataları için 2 kullandığını" bilmek çok güzel!
dantiston

2
@dantiston Concur. Yüce boyanmış yünlü Gentoo savunucusu, ama bunu hiç bilmiyordum ... bu kader güne kadar. ( Utançım şimdi sona eriyor. ) İlgili olarak, hiçbir satır eşleşmediğinde ve gerçek hatalarda grepçıkarak bu eğilimi kırdığını unutmayın . Çok teşekkürler Stallman. 12
Cecil Curry

32

Kayıt için, burada tanımlanan POSIX standart çıkış kodlarını kullanabilirsiniz .

Misal:

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
Dokümanlara göre bunlar sadece Unix işletim sistemlerinde mevcuttur, bu yüzden tamamen taşınabilir değildir.
phoenix

1
Tüm işletim sistemlerinde bulunan taşınabilir POSIX kodlarını istiyorsanız, exitstatusPyPI paketine bakın.
phoenix

1
Bu paketin tamamı başarı için 0, başarısızlık için 1'dir.
Pavel Minaev

25

errnoStandart çıkış kodlarını tanımlayan bir modül vardır:

Örneğin, İzin reddedildi hata kodu 13 :

import errno, sys

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

36
Bu yanlış. Bu hataların işlem çıkış kodları olarak kullanılması amaçlanmamıştır. Bunlar, özellikle C dilinde yazılmış olan programlarda dahili olarak kullanılması amaçlanan düşük seviyeli hata kodlarıdır. Python için mümkün olduğunca istisnalar kullanın.
SvdB

2
Haklısın. Bunlar dahili olarak kullanılmalıdır. Ancak normalde son kullanıcı düzeyinde istisnalar oluşturmazsınız. Sys.exit (x) yöntemini x ile isteğe bağlı olarak seçtiğiniz bir tamsayı olacak şekilde kullanırsınız. Ancak EX_ ile başlayan ve 'os' modülünde tanımlananları kullanabilirsiniz. Os.EX_OK veya os.EX_IOERR gibi
Oli

2
Üzgünüm, ama ben de aşağı oy kullanıyorum çünkü bu yanıltıcı. Çıkış durum kodları ve hata numaraları birbirinin yerine kullanılamaz / tamamlayıcı değildir . Verilen örneği kullanarak, "izin reddedildi" hata kodu 13 ( errnove errno.h'ye göre ), ancak çıkış durum kodu 77 ( osve sysexits.h'ye göre ) içerir. Birinciyi yayan programlar standart değildir ( fiili vel jure ) ve ikincisini haklı olarak bekleyen başkalarıyla iyi oynamazlar.
Mark G.9

14

0 çıkış kodları genellikle "burada yanlış bir şey yok" anlamına gelir. Ancak komut dosyasının programcısı konvansiyonu takip etmediyse, ne anlama geldiğini görmek için kaynağa danışmanız gerekebilir. Genellikle sıfır olmayan bir değer hata kodu olarak döndürülür.


6

Cevap "Sıfır çıkış kodunun ne anlama geldiğine bağlıdır"

Ancak, çoğu durumda, bu "Her şey yolunda" anlamına gelir


POSIX'i seviyorum:

Yani, kabuğa şunu yazardım:

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

Python betiğim çağrılırsa sys.exit(0)kabuk 'Tamam'ı döndürür

Python betiğim çağırırsa sys.exit(1)(veya sıfırdan farklı bir tam sayı), kabuk 'Tamam değil' değerini döndürür

Kabuk ile akıllıca davranmak ve çıkış kodlarının ne anlama geldiğini görmek için komut dosyanızın belgelerini (veya kaynağını) okumak sizin işiniz.


Sadece bütünlük için, Python komut dosyası yükseltilmiş hatası VEYA sözdizimi hatası varsa 'Tamam değil' yazdırılır.
Shital Shah

5

İşletim sistemi komutlarında çıkış kodları bulunur. Bununla ilgili bazı materyalleri görmek için linux çıkış kodlarına bakın. Kabuk, programın çalışıp çalışmadığını, sorun yaşadığını veya başarısız olup olmadığını belirlemek için çıkış kodlarını kullanır. Standart (veya en azından yaygın olarak kullanılan) çıkış kodları oluşturmak için bazı çabalar vardır. Bu Gelişmiş Kabuk Betiği yayınına bakın.


5

Sys.exit () kullanmak yerine exit (0) yerleşik ile temiz bir kapatma öneririm

Bunun iyi bir tavsiye olup olmadığından emin değilim.

Bahsedilen belgelere göre :

Site modülü (başlangıç ​​sırasında -S komut satırı seçeneği belirtilmedikçe otomatik olarak içe aktarılır) yerleşik ad alanına birkaç sabit ekler. İnteraktif tercüman kabuğu için kullanışlıdır ve programlarda kullanılmamalıdır .

Sonra:

çıkış (kod = Yok)

Basıldığında, “Çıkmak için quit () veya Ctrl-D (yani EOF) kullan” gibi bir mesaj yazdıran ve çağrıldığında SystemExit'i belirtilen çıkış koduyla yükselten nesneler.

Bunu sys.exit () belgeleriyle karşılaştırırsak, bir SystemExitistisna yaratan aynı mekanizmayı kullanır .



4

Çıkış kodları yalnızca kod yazarı tarafından atanan anlama gelir. Unix geleneği, çıkış kodu 0'ın 'başarı' anlamına geldiği, her şeyin başarısız olduğu anlamına gelir. Belirli bir komut dosyasının çıkış kodlarının ne anlama geldiğinden emin olmanın tek yolu komut dosyasının kendisini incelemektir.


2

Birçok programlama dilinde çıkış kodları programcılara bağlıdır. Bu yüzden program kaynak kodunuza (veya kılavuzunuza) bakmalısınız. Sıfır genellikle "her şey yolunda gitti" anlamına gelir.


-2

İstisna işleyicilerinin ve diğer şeylerin yürütülmesine izin vermek için , işlemi aniden sonlandıran exit(0)yerine yerleşik ile temiz bir kapatma öneririm sys.exit().


Peki fark nedir? Bu bilgi nereden geliyor? "Çıkışta" işleyicilerin yürütülmesi mi demek istediniz? SystemExither iki şekilde de kalkıyor gibi görünüyor.
0xC0000022L

mm, kafam karıştı os._exit, ikisi de yükseliyor gibi görünüyor SystemExit.
vidstige

1
Yanlış: tıpkı olduğu gibi temiz bir şekilde kapanıyor sys.exit() muexit() ? İkisi de aynı şeyi yapıyor: bir SystemExitistisna ortaya koyuyor. Aslında, exit()komut dosyaları için değil, etkileşimli oturumlar içindir, bu nedenle kavramsal sys.exit() olarak belirtilir. Kafa karıştırıyor olabilirsiniz os._exit(), aniden sona eren budur.
MestreLion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.