2010-12-15 17 views
6

Python'da (Linux sisteminde), os.system() kullanarak bir komut başlatıyorum ve dönüş kodunu aldım. Bu dönüş kodu 0'dan farklıysa, programın aynı dönüş koduyla çıkmasını istiyorum. Bu yüzden yazdım:Python'da sys.exit() için 0-255 aralık sınırlaması nasıl atlanır?

ret = os.system(cmd) 
if ret != 0: 
    print "exit with status %s" % ret 
    sys.exit(ret) 

dönüş kodu 256 düşükse, iyi çalışıyor, ancak 255'ten büyük olduğunda, kullanılan çıkış kodu ı sys.exit nasıl yapabilirim() kodlarının daha kabul 0'dır 255'ten daha mı?

Düzenleme: Limit ret değişken 256 alır Aslında gerçekte 255

olmakla sys.exit() kullanmak bozulursa, programın yerine 0 döndürür. El ile cmd başlattığınızda, ben (CentOS 5.5 Python 2.6.5) benim için 256.

cevap

0

İşleri, 1 döndürür değil görürüz:

$ python 
>>> import sys 
>>> sys.exit(245) 
$ echo $? 
245 
+0

Bu doğru değil, aynı şeyi test etmiyor. – unwind

+0

Üzgünüm, benim hatam, limit 255, 127 değil. –

+2

255 limiti, şu kabuk tarafından zorlanıyor: http://tldp.org/LDP/abs/html/exit-status.html ve http: // tldp. org/LDP/abs/html/exitcodes.html –

2

Sen olamaz olmamalı Çünkü sistem kendisi için 128'in üzerindeki çıkış kodlarını saklı tutmaktadır. Dönüş kodu 0'dan 127'ye kadar ise, programın kendisi tarafından çıktığı anlamına gelir. Dönüş kodu 128'den yüksekse, programın bir sistem sinyaliyle (örn. SIGKILL veya SIGTERM) sonlandırıldığı anlamına gelir. Sinyal numarası eksi 128 olan sonuç kodudur.

Bunu tespit etmeniz ve başka bir çeşit çıktı göstergesi yapmanız gerekir. Belki de dönüş kodunu STDOUT'a yazdırın ve sonra 0 (normal çıkış, normal çıkış) veya 1 ile döndürün (cmd, sıfır olmayan bir dönüş değerine sahipti, çıktı bir şey ifade ediyor).

düzenleme: Görünüşe (this comment itibaren), Python bir kabuk komut dosyası daha akıllı olduğunu ... düzenli Linux çıkış koduna geri söylemek gerekirse, şunu deneyin:

subprocess_exit_code = (ret >> 8) & 0x7f 
subprocess_signal_number = ret & 0xff 

if subpprocess_signal_number == 0: 
    exit_code = subprocess_exit_code 
else: 
    exit_code = 128 + subprocess_signal_number 

bu Core yok sayar rağmen bilgi dökümü.

5

Aslında documentation gösterir

çıkış durumu göstergesi: a 16-bitlik bir sayı, olan düşük bayt yüksek bayt çıkış durumu sinyal işlemi öldüren numarası ve (sinyal halinde sayı sıfırdır); Bir çekirdek dosya üretilirse düşük bayt yüksek bit ayarlanır.

ret = os.system(cmd) 
# Ignore the first byte, use the second one only 
ret = ret >> 8 
if ret != 0: 
    print "exit with status %s" % ret 
    sys.exit(ret) 

Ve şimdi çalışıyor:

yüzden(), gerçek çıkış durumu almak şöyle amacıyla sys.exit tarafından döndürülen sayıda işleme gerek ret 1 yerine 256 içerir

+0

Oh. Sadece segfaulty sonlandırmada neden 0x8b00 döndürdüğünü merak etmeye başladım. – ulidtko

+0

Eğer komut satırından çalıştırırsanız, sahip olabileceğiniz şeylere farklı bir çıkış kodu verecek olan çekirdek biriktirme yaparsa düşünüyorum. –

+1

'os.system' yerine' subprocess.call' kullanabilirsiniz: 'python -c 'import os; yazdır [os.system (["./ [ile "-18,128,255,256,257]] '' ve 'python -c' içe aktarma alt yordamı yazdırma [subprocess.call (["./exit-with ", str (i)] için çıkış" ile ", str (i)])) için [127,128,255,256,257]] ''' 'exit-with' 'dir http://ideone.com/zFelC – jfs

İlgili konular