Jaka jest wartość zwracana systemu operacyjnego.system() w Pythonie?

Natknąłem się na to:

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

Co to jest wartość zwracanaos.system()? Dlaczego mam 0?

Author: Martin Thoma, 2011-06-24

4 answers

Wartość zwracana os.system jest zależny od systemu operacyjnego.

W systemie Unix wartość zwracana jest liczbą 16-bitową, która zawiera dwie różne informacje. Z dokumentacji:

16-bitowa liczba, której niski bajt to numer sygnału, który zabił proces, a wysoki bajt to status zakończenia (jeśli numer sygnału jest równy zeru)

Więc jeśli liczba sygnału (niski bajt) wynosi 0, teoretycznie bezpiecznie byłoby przesunąć wynik o 8 bitów (result >> 8), Aby uzyskać kod błędu. Funkcja os.WEXITSTATUS robi dokładnie to. Jeśli kod błędu wynosi 0, zwykle oznacza to, że proces zakończył się bez błędów.

W systemie Windows dokumentacja określa, że zwracana wartość os.system jest zależna od powłoki. Jeśli powłoką jest cmd.exe (domyślna), wartość jest kodem zwracanym przez proces. Ponownie, 0 oznaczałoby, że nie było błędów.

Dla innych kodów błędów:

 37
Author: rubik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 17:38:54

os.system('command') zwraca 16 bitową liczbę, która pierwsze 8 bitów od lewej (lsb) mówi o sygnale używanym przez system operacyjny do zamknięcia polecenia, następne 8 bitów mówi o kodzie zwrotnym polecenia.

00000000    00000000
exit code   signal num

Przykład 1-polecenie exit z kodem 1

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

Przykład 2-polecenie exit z kodem 3

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

Teraz spróbuj z sygnałem - Przykład 3-Napisz program, który długo śpi, używa go jako polecenia w systemie operacyjnym.system () i następnie zabić go przez kill -15 lub 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

Możesz mieć program w Pythonie as command = 'python command.py"

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

W przypadku programu c lub C++ można użyć return from main () lub exit (n) z dowolnej funkcji #

Uwaga-dotyczy to Uniksa

W systemie Unix wartością zwracaną jest status zakończenia procesu zakodowanego w format określony dla wait (). Należy pamiętać, że POSIX nie określa znaczenie wartości zwracanej przez funkcję C system (), więc zwrot wartość funkcji Pythona jest zależna od systemu.

Os.wait ()

Poczekaj na zakończenie procesu potomnego i zwróć krotkę zawierającą jego oznaczenie PID i status zakończenia: 16-bitową liczbę, której niski bajt to numer sygnału, który zabił proces, a którego wysoki bajt jest stanem wyjścia (jeśli numer sygnału jest zerowy); wysoki bit niski bajt jest ustawiany, jeśli powstał plik core.

Availability: Unix

.

 18
Author: AlokThakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 05:50:23

" w systemie Unix zwracaną wartością jest wyjście status procesu zakodowanego w format określony dla wait (). Zauważ, że POSIX nie określa znaczenia wartość zwracana systemu C() funkcji, więc wartość zwracana przez Funkcja Pythona jest zależna od systemu."

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

Nie ma błędu, więc kod wyjścia to zero

 12
Author: Cez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 10:49:10

Os.system() zwraca jakieś wyjście uniksowe, a nie polecenie. Tak więc, jeśli nie ma błędu, to kod wyjścia zapisany jako 0.

 2
Author: sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 10:52:44