Ruft Makrokonstanten aus der C (++) - Headerdatei (.h) in Python ab

Beachten Sie, dass es ein besonderes Beispiel gab: "Ich möchte Konstanten zwischen Python und C ++ gemeinsam nutzen, die Konstanten auf der C ++ - Seite zur Kompilierungszeit korrigieren und dieselben Variablen in Python verwenden."

In .h von Python definiert

sample.h


#ifndef _PARAM
#define _PARAM

#define NUM 10
#define epoch 100

#endif

Nehmen Sie eine Konstante wie diese heraus. Dieses Mal werde ich die durch const int usw. definierten globalen Variablen nicht berücksichtigen, da es schwierig ist, sie zu klassifizieren.

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]

Was machst du

3. Zeile


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

Lesen Sie die Datei und listen Sie sie Zeile für Zeile auf. Dieses Mal habe ich eine Liste für jede Zeile erstellt und in eine Liste umgewandelt, aber es steht mir frei, "f.readline ()" für eine Anweisung separat zu verwenden

4. Zeile


    comment_flg = False

In C (++) ist alles von / * bis zum Ende mit * / ein Kommentar, also ein Flag, um sich daran zu erinnern.

6. Zeile


        items = l.split()

Rufen Sie eine Liste mit dem Inhalt der Zeile ab, die durch Leerzeichen halber Breite unterteilt ist.

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

Ich wollte eine solche Liste.

7. Zeile~13. Zeile


        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

Wie oben erwähnt, sind Kommentare ausgeschlossen.

14. Zeile~Zeile 15


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

Zeilen, die nicht mit "# define" beginnen, werden ausgeschlossen, da kein Makro definiert ist.

16. Zeile~Zeile 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]

Andere als die vorherigen sollten Konstanten sein. Zu diesem Zeitpunkt sollte items [1] einen konstanten Namen enthalten, ebenso wie items [1] in globals (), um zu überprüfen, ob dies als globale Variable definiert ist. Wenn es definiert ist, können Sie seinen Wert mit "globals () [items [1]]" ermitteln. Wenn Sie die Variable also zwangsweise neu schreiben, wird sie abgeschlossen. Wir verarbeiten jedoch, um den Bool-Typ von C ++ an Python auszurichten, und konvertieren auch float / int / str.

Recommended Posts

Ruft Makrokonstanten aus der C (++) - Headerdatei (.h) in Python ab
Erhalten Sie Wechselkurse von offenen Wechselkursen in Python
Schreiben Sie die O_SYNC-Datei in C und Python
Holen Sie sich den Batteriestand von SwitchBot mit Python
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Holen Sie sich mit Python die Niederschlagswahrscheinlichkeit aus XML
Abrufen des Metrikverlaufs von MLflow in Python
Holen Sie sich Komplimente von neuen Mädchen in C # paizahack_01
Von der Datei zur Diagrammzeichnung in Python. Grundstufe Grundstufe
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Holen Sie sich nur Artikel von Webseiten in Python
Dateioperationen in Python
Dateiverarbeitung in Python
Weiter Python in C-Sprache
Dateimanipulation mit Python
Holen Sie sich Datum in Python
C-API in Python 3
Holen Sie sich mit Python Daten vom GPS-Modul mit 10 Hz
Speichern Sie die Knotenstruktur in C ++ aus dem NetworkX-Dateiformat
Python-Handspiel (Spaltennamen aus CSV-Datei abrufen)
Holen Sie sich YouTube-Kommentare in Python
Dem Schlüssel F12 wurde ein Gerüstmakro in einer Python-Skriptdatei zugewiesen
Holen Sie sich Ihre Herzfrequenz von der Fitbit-API in Python!
OCR aus PDF in Python
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
Binäre Suche in Python / C ++
Rufen Sie den Wert ab, während Sie den Standardwert aus dict in Python angeben
Holen Sie sich die Terminalgröße in Python
Holen Sie sich explizit EOF in Python
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
Holen Sie sich Evernote-Notizen in Python
Nachricht vom ersten Offset mit Kafka Consumer in Python abrufen
Holen Sie sich japanische Synonyme mit Python
Holen Sie sich 1000 Beiträge in Python-Reihenfolge von allen Slack-Kanälen und fügen Sie sie in einer txt-Datei zusammen
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Lesen Sie die Datei in Python mit einem relativen Pfad aus dem Programm
Rufen Sie die Formel in der Excel-Datei als Zeichenfolge in Python ab
Holen Sie sich LeapMotion-Daten in Python.
Führen Sie das Python-Skript aus der Batchdatei aus
Rufen Sie C von Python mit DragonFFI auf
Manipulation des Datei- / Ordnerpfads in Python
Linebot-Erstellung und Dateifreigabe mit Python
Holen Sie sich den Desktop-Pfad in Python
ABC166 in Python A ~ C Problem
Rufen Sie popcount von Ruby / Python / C # auf
Holen Sie sich den Skriptpfad in Python
Erstellen Sie eine Binärdatei in Python
Extrahieren Sie mit Python Text aus Bildern
Löse ABC036 A ~ C mit Python
Holen Sie sich ein Kommunikationsmemo in Python
Tipps zum Aufrufen von Python von C.
Führen Sie Python-Code über die C # -GUI aus
So verpacken Sie C in Python
Python Holen Sie sich das kommende Wetter von der Wetter-API
Führen Sie Python-Skripte synchron von C # aus
Holen Sie sich den Desktop-Pfad in Python
ORC, Parkettdateivorgänge in Python
Holen Sie sich den Hostnamen in Python
Löse ABC037 A ~ C mit Python