2014-07-18 6 views
1

J'utilise le système python os.system pour imprimer une valeur reçue d'un fichier C.Comment retourner une valeur en utilisant un fichier C, puis le récupérer en python en utilisant os.system?

Mon fichier C dit ...

#include <stdio.h> 

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

Je dispose d'un fichier python qui effectue les opérations suivantes ...

import os 

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

print x 

Quand je lance le programme python sur une ligne de commande linux, Je reçois "hello world" imprimé avec succès, mais la variable x est imprimée comme 1792.

Je veux que x soit imprimé comme 7, pas 1792. Pourquoi x est-il imprimé comme 1792 et comment est-ce que je le fixe?

+1

double possible de [affectation d'une sortie de os.system à une variable et l'empêcher d'être affiché à l'écran] (http://stackoverflow.com/questions/3503879/assign-output-of-os-system-to-a-variable-and-prevent-it-from-being-displayed-on) – Emilien

+0

Vous pourriez avoir raison. Je vérifie la solution pour voir si ma question est inutile. – Alex

+1

@Emilien Non, il s'agit d'une tâche connexe, mais différente (capturant la * sortie * d'un programme, pas son code de sortie). – zwol

Répondre

1

Selon os.system documentation:

Sur Unix, la valeur de retour est l'état de sortie du processus codé en le format spécifié pour wait(). Notez que POSIX ne spécifie pas la signification de la valeur de retour de la fonction C system(), donc la valeur de retour de la fonction Python dépend du système.

Utilisez os.WEXITSTATUS pour obtenir le code de retour:

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

Merci cela a fonctionné! – Alex

+0

@Alex Vous préférez donc vous en tenir aux vieilles méthodes obsolètes comme 'os.system()' au lieu du 'subprocess' préféré? Votre choix, mais ne dites pas que vous n'avez pas été prévenu. – glglgl

+0

@glglgl Eh bien cela dépend quels sont les inconvénients. – Alex

1

La valeur retournée par os.system est un état d'attente, qui contient un codage de la valeur retournée par le programme, ainsi que d'autres informations. Vous le décoder avec os.WIFEXITED, os.WEXITSTATUS, and their relatives.

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

Deux détails supplémentaires que vous devez savoir sont: Si la valeur retournée par main (ou passé à exit) est négatif ou supérieur à 255, il sera tronqué. Si os.WIFEXITED(x) est faux, os.WEXITSTATUS(x) est une poubelle.

3

Les autres réponses sur os.WEXITSTATUS sont correctes, mais la méthode recommandée est subprocess. La documentation de os.system comprend le paragraphe suivant:

Le module subprocess fournit des installations plus puissants pour les nouveaux processus de frai et la récupération de leurs résultats; l'utilisation de ce module est préférable à l'utilisation de cette fonction. Voir la section Replacing Older Functions with the subprocess Module dans la documentation subprocess pour quelques recettes utiles.

Puisque vous êtes intéressé par le code de retour, vous pouvez utiliser subprocess.call:

import subprocess 

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

print x 
Questions connexes