Obtenir des constantes de macro à partir du fichier d'en-tête C (++) (.h) en Python

Notez qu'il y avait un exemple particulier que «je veux partager des constantes entre Python et C ++, je veux corriger les constantes côté C ++ au moment de la compilation, et je veux utiliser les mêmes variables en Python».

Défini en .h depuis Python

sample.h


#ifndef _PARAM
#define _PARAM

#define NUM 10
#define epoch 100

#endif

Sortez une constante comme celle-ci. Cette fois, je ne considérerai pas les variables globales définies par const int etc. car il est difficile de les classer.

def read_header_and_get_macro(header_filepath):
    with open(header_filepath, mode='r') as f:
        lst = [s.strip() for s in f.readlines()]
    comment_flg = False
    for l in lst:
        items = l.split()
        if len(items) != 0 and items[0] == "/*":
            comment_flg = True
            continue
        if comment_flg == True:
            if len(items) != 0 and items[0] == "*/":
                comment_flg = False
            continue
        if len(items) < 2 or items[0] != "#define":
            continue
        if items[1] in globals():
            if items[2] == 'true':
                globals()[items[1]] = True
            elif items[2] == 'false':
                globals()[items[1]] = False
            else:
                try:
                    globals()[items[1]] = float(items[2])
                except ValueError:
                    try:
                        globals()[items[1]] = int(items[2])
                    except ValueError:
                        globals()[items[1]] = items[2]

Que fais tu

3e ligne


    lst = [s.strip() for s in f.readlines()]

Lisez le fichier et listez-le ligne par ligne. Cette fois, j'ai pris une liste pour chaque ligne et l'ai tournée dans une liste, mais je suis libre de tourner f.readline () pour une déclaration séparément

4ème ligne


    comment_flg = False

En C (++), tout ce qui va de / * à la fin avec * / est un commentaire, donc un drapeau pour s'en souvenir.

6ème ligne


        items = l.split()

Obtenez une liste du contenu de la ligne, qui est divisée par des espaces demi-largeur.

['#define', 'NUM', '10']

Je voulais une liste comme celle-ci.

7ème ligne~13e ligne


        if len(items) != 0 and items[0] == "/*":
            comment_flg = True
            continue
        if comment_flg == True:
            if len(items) != 0 and items[0] == "*/":
                comment_flg = False
            continue

Comme mentionné ci-dessus, les commentaires sont exclus.

14ème ligne~Ligne 15


        if len(items) < 2 or items[0] != "#define":
            continue

Les lignes qui ne commencent pas par «# define» sont exclues car aucune macro n'est définie.

16e ligne~Ligne 28


        if items[1] in globals():
            if items[2] == 'true':
                globals()[items[1]] = True
            elif items[2] == 'false':
                globals()[items[1]] = False
            else:
                try:
                    globals()[items[1]] = float(items[2])
                except ValueError:
                    try:
                        globals()[items[1]] = int(items[2])
                    except ValueError:
                        globals()[items[1]] = items[2]

Autres que les précédents devraient être des constantes. A ce moment, ʻitems [1] doit contenir un nom constant, donc ʻitems [1] dans globals () est utilisé pour vérifier si cela est défini comme une variable globale. Si elle est définie, vous pouvez trouver sa valeur avec globals () [items [1]], donc si vous réécrivez de force la variable, elle sera complétée. Cependant, nous travaillons pour aligner le type booléen de C ++ sur Python, et nous convertissons également float / int / str.

Recommended Posts

Obtenir des constantes de macro à partir du fichier d'en-tête C (++) (.h) en Python
Obtenir des données de Quandl en Python
Obtenez des taux de change à partir des taux de change ouverts en Python
Ecrire le fichier O_SYNC en C et Python
Obtenez le niveau de la batterie de SwitchBot avec Python
Générer un langage C à partir d'une expression S avec Python
Obtenez la probabilité de précipitation de XML avec Python
Obtenir l'historique des métriques de MLflow en Python
Recevoir des compliments de nouvelles filles en C # paizahack_01
Du dessin de fichier au graphique en Python. Élémentaire élémentaire
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Obtenez uniquement des articles de pages Web en Python
Opérations sur les fichiers en Python
Traitement de fichiers en Python
Next Python en langage C
Manipulation de fichiers avec Python
Obtenir la date en Python
API C en Python 3
Obtenez des données du module GPS à 10 Hz avec Python
Stocker la structure des nœuds en C ++ à partir du format de fichier NetworkX
Python hand play (obtenir les noms de colonnes à partir du fichier CSV)
Obtenez des commentaires YouTube en Python
Affectation d'une macro de génération de modèles dans un fichier de script Python à la touche F12
Obtenez votre fréquence cardiaque à partir de l'API fitbit en Python!
OCR à partir de PDF en Python
Obtenez le type MIME en Python et déterminez le format de fichier
Recherche binaire en Python / C ++
Obtenez la valeur tout en spécifiant la valeur par défaut de dict en Python
Obtenir la taille du terminal en Python
Obtenir explicitement EOF en python
Appuyez sur REST en Python pour obtenir des données de New Relic
Obtenez des notes Evernote en Python
Obtenir le message du premier offset avec le consommateur kafka en python
Obtenez des synonymes japonais avec Python
Obtenez 1000 publications dans l'ordre Python de tous les canaux Slack et rassemblez-les dans un fichier txt
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Lisez le fichier en Python avec un chemin relatif depuis le programme
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
Obtenez des données LeapMotion en Python.
Exécuter le script Python à partir du fichier de commandes
Appeler C depuis Python avec DragonFFI
Manipulation de chemin de fichier / dossier en Python
Création de Linebot et partage de fichiers avec Python
Obtenez le chemin du bureau en Python
ABC166 en Python A ~ C problème
Appeler popcount depuis Ruby / Python / C #
Obtenez le chemin du script en Python
Créer un fichier binaire en Python
Extraire du texte d'images avec Python
Résoudre ABC036 A ~ C avec Python
Obtenir, publier un mémo de communication en Python
Conseils pour appeler Python à partir de C
Exécuter du code Python à partir de l'interface graphique C #
Comment envelopper C en Python
python Obtenez la météo à venir de l'API météo
Exécutez des scripts Python de manière synchrone à partir de C #
Obtenez le chemin du bureau en Python
ORC, opérations de fichier Parquet en Python
Obtenez le nom d'hôte en Python
Résoudre ABC037 A ~ C avec Python