Что такое возвращаемое значение os.system () в Python? - PullRequest
39 голосов
/ 24 июня 2011

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

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

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

Ответы [ 5 ]

39 голосов
/ 24 июня 2011

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

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

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

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

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

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

21 голосов
/ 12 февраля 2016

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

.

12 голосов
/ 24 июня 2011

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

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

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

3 голосов
/ 24 июня 2011

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

1 голос
/ 08 апреля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...