2009-10-08 10 views
5

related question में, मैंने पूछा कि सी फ़ंक्शन "प्रतीक्षा" के लिए प्रलेखन कहां ढूंढें। यह command.getstatusoutput() मॉड्यूल के लिए रिटर्न कोड को समझने का प्रयास था। Stackoverflow के माध्यम से आया, लेकिन दस्तावेज मदद नहीं की।पायथन कमांड में स्थिति कोड की व्याख्या कैसे करें .getstatusoutput()

#!/usr/bin/python 
import commands 
goodcommand = 'ls /' 
badcommand = 'ls /fail' 
status, output = commands.getstatusoutput(goodcommand) 
print('Good command reported status of %s' % status) 
status, output = commands.getstatusoutput(badcommand) 
print('Bad command reported status of %s' % status) 

जब पर ओएस एक्स (तेंदुआ) चलाने मैं निम्नलिखित उत्पादन प्राप्त: (। कौन सा प्रलेखन से मेल खाता है)

$ python waitest.py 
Good command reported status of 0 
Bad command reported status of 256 

OS X पर, कर एक "ls/असफल यहाँ क्या पहेली मुझे है ; echo $? "

$ ls /fail ; echo $? 
ls: /fail: No such file or directory 
1 

जब लिनक्स (Ubuntu Hardy) पर चलाने के मैं निम्नलिखित उत्पादन हो:

$ python waitest.py 
Good command reported status of 0 
Bad command reported status of 512 

उबंटू पर, कर "ls/असफल" हो जाता है एक 2:

$ ls /fail ; echo $? 
ls: cannot access /fail: No such file or directory 
2 
निम्नलिखित उत्पादन हो जाता है

तो पाइथन 256 तक स्टेटस कोड गुणा कर रहा है। हू? क्या यह कहीं दस्तावेज है?

+0

[@Schof द्वारा जवाब] होना चाहिए (http://stackoverflow.com/a/1535675/52074) सवाल का जवाब "का उपयोग करते समय' command.getstatusoutput() '256 तक एक्जिटकोड गुणा क्यों हैं? " सीधे और उदाहरण कोड के साथ। अन्य दो उत्तरों में कम से कम 'कमांड'getstatusoutput() '" या "subprocess का उपयोग करने के तरीके" के बजाय "subprocess' का उपयोग करें" कहें। –

उत्तर

10

os मॉड्यूल (os.WIFCONTINUED, os.WIFSTOPPED, os.WTERMSIG, os.WCOREDUMP, os.WIFEXITED, os.WEXITSTATUS, os.WIFSIGNALED, os.WSTOPSIG) में काम करता है, जो wait(2) पुस्तिका से मैक्रो के अनुरूप का एक सेट है। आपको स्थिति कोड की व्याख्या करने के लिए उनका उपयोग करना चाहिए।

उदाहरण के लिए, आप os.WEXITSTATUS(status)

का उपयोग करना चाहिए एक बेहतर विचार subprocess मॉड्यूल करने के लिए स्विच करने के लिए होगा बाहर निकलने के कोड प्राप्त करने के।

4

वाह। अंतर्दृष्टि कि यह 256 तक बढ़ रहा था मुझे वहां मिला। "पायथन कमांड +256" के लिए खोजकर मुझे Python Module Of The Week आलेख मिला जो बताता है कि क्या हो रहा है।

यहाँ कि पेज से एक टुकड़ा है:

समारोह getstatusoutput() खोल के माध्यम से एक आदेश चलाता है और बाहर निकलने के कोड और पाठ निर्गम (stdout और stderr संयुक्त) देता है। निकास कोड सी फ़ंक्शन प्रतीक्षा() या os.wait() के समान हैं। कोड 16-बिट संख्या है। निम्न बाइट में सिग्नल नंबर है जो प्रक्रिया को मार डाला है। जब संकेत शून्य होता है, उच्च बाइट प्रोग्राम की निकास स्थिति है। यदि कोर फ़ाइल बनाई गई थी, निम्न बाइट का उच्च बिट सेट है।

और डौग कोड के कुछ:

from commands import * 

def run_command(cmd): 
    print 'Running: "%s"' % cmd 
    status, text = getstatusoutput(cmd) 
    exit_code = status >> 8 
    signal_num = status % 256 
    print 'Signal: %d' % signal_num 
    print 'Exit : %d' % exit_code 
    print 'Core? : %s' % bool(exit_code/256) 
    print 'Output:' 
    print text 
    print 

run_command('ls -l *.py') 
run_command('ls -l *.notthere') 
run_command('echo "WAITING TO BE KILLED"; read input') 
+0

ओएससिस्टम (सीएमडी) की वापसी उसी तरह काम करती है, जो अंतर्दृष्टि है कि यह 256' – CaffeineAddiction

3

commands.py को देखते हुए:

def getstatusoutput(cmd): 
    """Return (status, output) of executing cmd in a shell.""" 
    import os 
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') 
    text = pipe.read() 
    sts = pipe.close() 
    if sts is None: sts = 0 
    if text[-1:] == '\n': text = text[:-1] 
    return sts, text 

हम देखते हैं stsos.popen(...).close() का मूल्य रखती है। that documentation को देखते हुए, os.popen(...).close()os.wait का मान देता है: एक बच्चे की प्रक्रिया के पूरा होने के लिए

os.wait()

प्रतीक्षा करें, और एक टपल अपने पीआईडी ​​और बाहर निकलने स्थिति संकेत लौटाएगा: एक 16-बिट संख्या, जिसका कम बाइट सिग्नल नंबर है जो प्रक्रिया को मारता है, और जिसका उच्च बाइट बाहर निकलने की स्थिति है (यदि सिग्नल नंबर शून्य है); कोर फ़ाइल का निर्माण होने पर निम्न बाइट का उच्च सेट सेट होता है। उपलब्धता: यूनिक्स।

जोर मेरा था। मैं मानता हूं कि यह "एन्कोडिंग" बहुत सहज नहीं है, लेकिन कम से कम यह एक नज़र में काफी स्पष्ट था कि इसे गुणा/थोड़ा-स्थानांतरित किया जा रहा था।

+0

द्वारा गुणा कर रहा था, जोर देने के लिए धन्यवाद, जब तक मैं इसे पढ़ नहीं पाया तब तक मैं बहुत उलझन में था .. –

0

मुझे लगता है कि कोड पहचान गलत है।

"यदि कोर फ़ाइल बनाई गई थी, तो निम्न बाइट का उच्च बिट सेट है।" इसका मतलब है 128

तो मुझे लगता है मुख्य लाइन

print 'Core? : %s' % bool(status & 128) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^