2009-10-08 15 views
5

Trong một related question, tôi hỏi nơi tìm tài liệu cho hàm C "chờ". Đây là một nỗ lực để tìm ra mã trả về cho mô-đun commands.getstatusoutput(). Stackoverflow đã đi qua, nhưng tài liệu không giúp được gì. Đây là những gì tôi bối rối:Cách diễn giải mã trạng thái trong lệnh Python.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) 

Khi chạy trên OS X (Leopard) tôi nhận được kết quả như sau: (. Mà phù hợp với tài liệu hướng dẫn)

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

Trên OS X, làm một "ls/thất bại ; echo $? " được kết quả như sau:

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

Khi chạy trên Linux (Ubuntu Hardy) tôi nhận được kết quả như sau:

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

Trên Ubuntu, làm "ls/thất bại" được một 2:

$ ls /fail ; echo $? 
ls: cannot access /fail: No such file or directory 
2 

Vì vậy, Python dường như đang nhân mã trạng thái với 256. Huh? Đây có phải là tài liệu ở đâu đó không?

+0

các [câu trả lời bằng @Schof] (http://stackoverflow.com/a/1535675/52074) trả lời câu hỏi "khi sử dụng' commands.getstatusoutput() 'tại sao các exitcodes nhân với 256?" trực tiếp và với mã ví dụ. Hai câu trả lời khác nhiều hay ít nói "sử dụng' subprocess' thay vì 'commands.getstatusoutput()' "hoặc" đây là cách sử dụng subprocess ". –

Trả lời

10

Có một tập hợp các hàm trong os mô-đun (os.WIFCONTINUED, os.WIFSTOPPED, os.WTERMSIG, os.WCOREDUMP, os.WIFEXITED, os.WEXITSTATUS, os.WIFSIGNALED, os.WSTOPSIG), tương ứng với các macro từ wait(2) bằng tay. Bạn nên sử dụng chúng để diễn giải mã trạng thái.

Ví dụ, để lấy mã lối ra bạn nên sử dụng os.WEXITSTATUS(status)

Một ý tưởng tốt hơn sẽ được chuyển sang subprocess module.

4

Wow. Cái nhìn sâu sắc rằng nó đã nhân với 256 đã cho tôi ở đó. Tìm kiếm "lệnh python +256" đã đưa tôi đến một bài viết Python Module Of The Week giải thích những gì đang xảy ra.

Dưới đây là một đoạn trích từ trang đó:

Chức năng getstatusoutput() chạy một lệnh qua vỏ và trả về mã thoát và đầu ra văn bản (stdout và stderr kết hợp). Mã thoát giống với hàm C wait() hoặc os.wait(). Mã này là số 16 bit. Các byte thấp chứa số tín hiệu đã giết chết quy trình . Khi tín hiệu bằng 0, byte cao là trạng thái thoát của chương trình . Nếu một tệp lõi được tạo, bit cao của byte thấp được đặt.

Và một số mã của Doug:

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

sự trở lại của os.system (cmd) dường như hoạt động theo cùng một cách 'thấu hiểu rằng nó được nhân với 256' – CaffeineAddiction

3

Nhìn vào 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 

Chúng ta thấy sts giữ giá trị của os.popen(...).close(). Nhìn vào that documentation, os.popen(...).close() trả về giá trị của os.wait:

os.wait()

Chờ hoàn thành một quá trình con, và trả về một tuple chứa dấu hiệu pid và trạng thái thoát của nó: một số 16-bit, mà thấp byte là số tín hiệu đã giết chết quá trình và có byte cao là trạng thái thoát (nếu số hiệu là zero); bit cao của byte thấp được đặt nếu một tệp lõi được tạo ra. Tính khả dụng: Unix.

Nhấn mạnh là của tôi. Tôi đồng ý rằng điều này "mã hóa" không phải là trực quan khủng khiếp, nhưng ít nhất nó đã được khá rõ ràng trong nháy mắt rằng nó đã được nhân lên/bit-shifted.

+0

Cảm ơn bạn đã nhấn mạnh, tôi đã khá bối rối bởi những gì tôi đã nhìn thấy cho đến khi tôi đọc này .. –

0

Tôi nghĩ rằng việc phát hiện mã không chính xác.

"Nếu tệp lõi được tạo, bit cao của byte thấp được đặt". có nghĩa là 128.

vì vậy tôi nghĩ rằng dòng lõi nên

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