Как интерпретировать код состояния в Python commands.getstatusoutput ()

SSL-сертификаты привязаны к имени хоста. Таким образом, чтобы иметь возможность использовать его на своем компьютере разработчика, вы должны разрешить имя хоста на своем компьютере разработчика (т.е. использовать файл hosts)

7
задан Mogsdad 17 January 2018 в 03:26
поделиться

4 ответа

В модуле os есть набор функций ( os.WIFCONTINUED , os.WIFSTOPPED , os .WTERMSIG , os.WCOREDUMP , os.WIFEXITED , os.WEXITSTATUS , os.WIFSIGNALED [11473363], , .WSTOPSIG ), которые соответствуют макросам из руководства wait (2) . Их следует использовать для интерпретации кода состояния.

Например, чтобы получить код выхода, вы должны использовать os.WEXITSTATUS (status)

Лучше переключиться на подпроцесс ] модуль.

11
ответ дан 6 December 2019 в 10:51
поделиться

Глядя на 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

Мы видим, что sts содержит значение os.popen (...). close () . Глядя на , эта документация , os.popen (...). Close () возвращает значение os.wait :

os .wait ()

Дождаться завершения дочернего процесса и вернуть кортеж, содержащий его pid и индикацию статуса выхода: 16-битное число, младший байт которого является номером сигнала, который завершил процесс, и , чей старший байт - это статус выхода (если номер сигнала равен нулю); старший бит младшего байта устанавливается, если был создан файл ядра. Доступность: Unix.

Упор был сделан мной. Я согласен, что эта "кодировка" не очень интуитивна,

3
ответ дан 6 December 2019 в 10:51
поделиться

Вау. Понимание того, что он умножается на 256, привело меня к этому. Поиск «команд python +256» привел меня к статье Python Module Of The Week , в которой объясняется, что происходит.

Вот фрагмент с этой страницы:

Функция getstatusoutput () запускает через оболочку и возвращает код выхода и вывод текста (stdout и stderr вместе взятые). Коды выхода такие же, как для функции C wait () или 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')
4
ответ дан 6 December 2019 в 10:51
поделиться

Я считаю, что определение кода неверно.

«Если был создан файл ядра, устанавливается старший бит младшего байта». означает 128.

поэтому я думаю, что основная строка должна быть

print 'Core? : %s' % bool(status & 128)
0
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: