9
votes

Comment puis-je référer #defines dans un fichier C de Python?

J'ai un fichier C qui a un tas de #defines pour les bits que j'aimerais faire référence à Python. Il y en a assez que je préfère ne pas les copier dans mon code Python, est là une méthode acceptée pour les référencer directement de Python?

Remarque: Je sais que je peux simplement ouvrir le fichier d'en-tête et analyser cela Soyez simple, mais s'il y a une manière plus pythonique, j'aimerais l'utiliser.

Edit:

Ce sont très simples #defines qui définissent la signification des bits dans un masque , par exemple: xxx


3 commentaires

Dupliqué possible de


Je pense que c'est un duplicache à Stackoverflow.com/Questtions/2654329/...


@Mattilyra - Peut-être. Mais voyant que cette question n'a actuellement aucune réponse, ce n'est pas un point particulièrement utile.


5 Réponses :


1
votes

#define s sont des macros, qui n'ont aucune signification à l'extérieur du préprocesseur de votre compilateur C. En tant que tels, ils sont le fléau des programmeurs multilingues partout. (Par exemple, voir cette question ADA: Définition de la licence pour les modules Dans le noyau Linux à partir de deux semaines).

Short d'exécution de votre code source via le c-préprocesseur C, il n'y a vraiment aucun moyen de traiter avec eux. Je comprends généralement ce qu'elles évaluent (dans des cas complexes, souvent, il n'y a pas de meilleur moyen de le faire que de compiler et d'exécuter le bon code!) Et du code dur qui valeur dans mon programme.

Le (bien l'une des) parties gênantes est que le prétraiteur C est considéré par C coders comme une petite chose très simple qu'ils utilisent souvent sans même donner une seconde pensée. En conséquence, ils ont tendance à être choqués qu'il provoque de gros problèmes d'interopérabilité, tandis que nous pouvons gérer la plupart des autres problèmes qui nous lancent assez facilement.

Dans le cas simple représenté ci-dessus, de loin le moyen le plus simple de gérer qu'il serait d'encoder les mêmes deux valeurs des constantes de votre programme Python quelque part. Si vous avez une grosse affaire, cela ne serait probablement pas un problème pour écrire un programme Python pour analyser ces valeurs hors du fichier. Toutefois, vous devez vous rendre compte que votre code C ne réévaluerait que ces valeurs sur une compilée, tandis que votre programme Python le ferait chaque fois qu'il s'exécute (et devrait donc être exécuté que lorsque le code C est également compilé).


1 commentaires

Je pense que pour de nombreuses personnes la méthode simple que vous avez suggérée fonctionnera, à l'analyse de l'en-tête ou à la tête des #defines dans un éditeur et de rechercher / remplacer pour les traduire en constons Python, en fonction de la fréquence à laquelle l'en-tête pourrait changer.



7
votes

exécuté sous l'hypothèse que le fichier C 2.7 (testé). Supposons que le fichier contenant juste définit est nommé jus_defines.h comme ci-dessus: xxx pré>

alors: p> xxx pré>

utilisation: p>

$ python 
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import just
>>> dir(just)
['FOO_A', 'FOO_B', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_just', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic']
>>> just.FOO_A
3
>>> just.FOO_B
5
>>> 


1 commentaires

Cette méthode a fonctionné super! Je dois décider si cela vaut la peine d'écrire un C simple pour interfacer avec cet en-tête. Cela pourrait être simplement plus simple pour ce que j'ai besoin pour analyser l'en-tête C à la main.



7
votes

Vous pourriez avoir une chance avec le H2PY. py script trouvé dans le outils / scripts répertoire de la boucle Source Python. Bien qu'il ne puisse pas gérer des macros de préprocesseur complexes, cela pourrait être suffisant pour vos besoins.

Voici une description de la fonctionnalité du haut du script:

lire # définir et traduire en code Python. Gérer #include des déclarations. Manipuler #define Macros avec un argument. Tout ce qui n'est pas reconnu ou ne se traduit pas en valide Python est ignoré.

Sans arguments du nom de fichier, agit comme un filtre. Si un ou plusieurs noms de fichiers sont donnés, la sortie est écrite sur correspondant noms de fichiers dans le répertoire local, traduits à tous les majuscules, avec l'extension remplacée par ".py".

En passant une ou plusieurs options de la forme "-i régulière_expression" Vous pouvez spécifier des chaînes supplémentaires à ignorer. C'est utile par exemple. Pour ignorer les moulages à U_LONG: spécifiez simplement "-i '(u_long)" ".


0 commentaires

1
votes

Si vous écrivez un module d'extension, utilisez http: // docs.python.org/3/c-api/module.html#pymodule_adddintmacro


0 commentaires

0
votes

J'avais presque exactement ce même problème alors écrit un script Python pour analyser le fichier C. Il est destiné à être renommé pour correspondre à votre fichier C (mais avec .Py à la place de .h) et importé comme module Python.

code: https://gist.github.com/camlee/3bf869A5bf39ac5954fdaabbe6a3f437 ​​ p>

Exemple: p>

configuration.h p>

>>> import configuration
>>> print("The verbosity level is %s" % configuration.VERBOSE)
The verbosity level is 3
>>> configuration.DEBUG_FILE
'"debug.log"'
>>> configuration.NOT_DEBUGGING is None
True


0 commentaires