Что такое возвращаемое значение os.system() в Python?

Я сталкивался с этим:

>>> import os
>>> os.system('ls')
file.txt README
0

Что такое возвращаемое значение os.system()? Почему я получаю 0?

8 ответов

Решение

Возвращаемое значение os.system зависит от ОС.

В Unix возвращаемое значение представляет собой 16-разрядное число, которое содержит две разные части информации. Из документации:

16-разрядное число, младший байт которого - номер сигнала, который убил процесс, а старший байт - состояние выхода (если номер сигнала равен нулю)

Таким образом, если номер сигнала (младший байт) равен 0, теоретически было бы безопасно сместить результат на 8 бит (result >> 8) чтобы получить код ошибки. Функция os.WEXITSTATUS делает именно это Если код ошибки равен 0, это обычно означает, что процесс завершился без ошибок.

В Windows в документации указано, что возвращаемое значение os.system зависит от оболочки. Если оболочка cmd.exe (значение по умолчанию), значение является кодом возврата процесса. Опять же, 0 будет означать, что ошибок не было.

Для других кодов ошибок:

os.system('command') возвращает 16-битное число, из которых первые 8 бит слева (lsb) говорят о сигнале, используемом os для закрытия команды, следующие 8 бит говорят о коде возврата команды.

00000000    00000000
exit code   signal num

Пример 1 - команда выхода с кодом 1

os.system('command') #it returns 256
256 in 16 bits -  00000001 00000000
Exit code is 00000001 which means 1

Пример 2 - команда выхода с кодом 3

os.system('command') # it returns 768
768 in 16 bits  - 00000011 00000000
Exit code is 00000011 which means 3

Теперь попробуйте с сигналом - Пример 3 - Напишите программу, которая долгое время находится в спящем режиме, используйте ее как команду в os.system(), а затем уничтожьте ее с помощью kill -15 или kill -9

os.system('command') #it returns signal num by which it is killed
15 in bits - 00000000 00001111
Signal num is 00001111 which means 15

Вы можете иметь программу на Python как command = 'python command.py'

import sys
sys.exit(n)  # here n would be exit code

В случае программ на c или C++ вы можете использовать return из main() или exit(n) из любой функции #

Примечание. Это применимо к Unix.

В Unix возвращаемое значение является состоянием выхода процесса, закодированного в формате, указанном для wait(). Обратите внимание, что POSIX не определяет значение возвращаемого значения функции C system(), поэтому возвращаемое значение функции Python зависит от системы.

os.wait ()

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

Availability: Unix

,

Вы можете использовать

return_value = os.popen('ls').read()

вместо. os.system только возвращает значение ошибки.

"В Unix возвращаемое значение является состоянием выхода процесса, закодированного в формате, указанном для wait(). Обратите внимание, что POSIX не определяет значение возвращаемого значения функции C system(), поэтому возвращаемое значение Функция Python зависит от системы. "

http://docs.python.org/library/os.html

Там нет ошибки, поэтому код выхода равен нулю

os.system() возвращает некоторый вывод Unix, а не вывод команды. Итак, если ошибки нет, код выхода записывается как 0.

Этот код проверяет, существует ли команда в системе. он использует встроенную оболочку, буквально вызываемую именно для этой цели. Существует также встроенная функцияhash, который после проверки скорости выполнения я определилcommandбыстрее:

if os.system("command -v command_name_here") == 0: ...

На основании ответа @AlokThakur (спасибо!):

def run_system_command(command):
    return_value = os.system(command)
    # Calculate the return value code
    return_value = int(bin(return_value).replace("0b", "").rjust(16, '0')[:8], 2)
    if return_value != 0:
        raise RuntimeError(f'The system command\n{command}\nexited with return code {return_value}')

Если вы хотите сохранить результат выполнения команды в командной строке os.system("")

Вот альтернатива, которая сохраняет вывод в переменной output

       # code to execute a command and store it's output in a variable

import subprocess as sp
output = sp.getoutput("whoami")
print(output)
Другие вопросы по тегам