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]
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