2014-07-18 2 views
1

Я использую python os.system для печати значения, полученного из файла C.Как вернуть значение с помощью C-файла, а затем забрать его в python с помощью os.system?

Мой файл C говорит ...

#include <stdio.h> 

main() 
{ 
printf("hello world\n"); 
return 7; 
} 

Тогда у меня есть файл питона, который делает следующее ...

import os 

x = os.system("./a.out") 

print x 

Когда я запускаю программу питона на командной строке Linux, Я получаю «hello world» успешно напечатанный, но переменная x напечатана как 1792.

Я хочу, чтобы x был напечатан как 7, а не 1792. Почему x печатается как 1792 и как его исправить?

+1

возможно дубликат [Назначение вывода os.system переменной и предотвратить ее на экране] (http://stackoverflow.com/questions/3503879/assign-output-of-os-system-to-a-variable-and-prevent-it-from-being-displayed-on) – Emilien

+0

Вы можете быть правы. Я проверяю решение там, чтобы узнать, бесполезен ли мой вопрос. – Alex

+1

@Emilien Нет, это говорит о связанной, но другой задаче (захват * вывода * программы, а не код выхода). – zwol

ответ

1

Согласно os.system documentation:

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

Использование os.WEXITSTATUS получить код возврата:

import os 
x = os.system("./a.out") 
print os.WEXITSTATUS(x) 
+0

Спасибо, это сработало! – Alex

+0

@Alex Итак, вы предпочитаете придерживаться старых, устаревших методов, таких как 'os.system()' вместо предпочтительного 'subprocess'? Ваш выбор, но не говорите, что вас не предупредили. – glglgl

+0

@glglgl Ну, это зависит от недостатков. – Alex

1

Значение, возвращенное из os.system является статус ожидания, который содержит кодирование значения, возвращенного программой, а также другая информация. Вы декодируете его с помощью os.WIFEXITED, os.WEXITSTATUS, and their relatives.

>>> import os 
>>> x = os.system("exit 7") 
>>> x 
1792 
>>> os.WIFEXITED(x) 
True 
>>> os.WEXITSTATUS(x) 
7 

Два дополнительных деталей, которые необходимо знать, являются: Если возвращаемое значение из main (или передается exit) отрицателен или больше 255, оно будет обрезано. Если os.WIFEXITED(x) является ложным, os.WEXITSTATUS(x) - это мусор.

3

Другие ответы про os.WEXITSTATUS верны, но рекомендуемый способ сделать это - subprocess. Документация os.system включает следующий пункт:

Модуль subprocess предоставляет более мощные средства для порождения новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этой функции. См. Раздел Replacing Older Functions with the subprocess Module в документации subprocess для некоторых полезных рецептов.

Поскольку вы заинтересованы в обратном коде, вы можете использовать subprocess.call:

import subprocess 

x = subprocess.call(['./a.out']) 

print x 
Смежные вопросы