Рассмотрим сначала случай с командами оболочки — в операционной системе Linux запускаются программы из примеров 5.15 и 5.16, производится чтение вывода этих сценариев через каналы и получение кодов завершения:
[mark@linux]$ python
> >> import os
> >> pipe = os.popen(‘python testexit_sys.py’)
> >> pipe.read()
‘Bye sys world\012’
>>> stat = pipe.close() # возвращает код завершения
>>> stat
10752
>>> hex(stat)
‘0x2a00’
> >> stat >> 8 # извлекает код завершения из битовой маски
42
> >> pipe = os.popen(‘python testexit_os.py’)
> >> stat = pipe.close()
> >> stat, stat >> 8
(25344, 99)
В версии Cygwin Python под Windows этот пример действует точно так же. При использовании функции os.popen в Unix-подобных системах по причинам, которые мы не будем здесь рассматривать, код завершения помещается в определенные битовые позиции возвращаемого значения.
Код действительно находится там, но чтобы его увидеть, нужно сдвинуть результат вправо на восемь разрядов. Код завершения команд, выполняемых с помощью функции os.system, можно получить с помощью библиотечной функции:
> >> stat = os.system(‘python testexit_sys.py’)
Bye sys world
> >> stat, stat >> 8 (10752, 42)
> >> stat = os.system(‘python testexit_os.py’)
Bye os world
> >> stat, stat >> 8
(25344, 99)
Все эти приемы действуют и в стандартной версии Python для Windows, однако в этой операционной системе код завершения уже не является битовой маской (проверяйте значение sys.platform, если ваша программа должна работать на обеих платформах):
C:\…\PP4E\System\Exits> python
> >> os.system(‘python testexit_sys.py’)
Bye sys world 42
> >> os.system(‘python testexit_os.py’)
Bye os world
99
> >> pipe = os.popen(‘python testexit_sys.py’)
> >> pipe.read()
‘Bye sys world\n’
> >> pipe.close()
42
>>>
> >> os.popen(‘python testexit_os.py’).close() 99
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011