Что такое возвращаемое значение 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)