regular expression Anfang

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Hi

Ok habe nun herausgefunden wie man mehrere Pfade angeben kann (mit []). Ich lasse mir nun alls Pfade heraussuchen wo header dateien enthalten sind und stelle einen String zusammen der passen sollte. Wenn ich den String an die Parse Funktion übergebe funktioniert es nicht wenn ich den Inhalt des String ausgebe und diesen in die python Datei kopiere dann gehts.

Code: Alles auswählen

self.headers = "[r'-Ipycparser-master/utils/fake_libc_include/', r'-Ipycparser-master/utils/fake_libc_include/sys/']"

# Funktioniert
ast = parse_file(filePath, use_cpp=True, cpp_args=[r'-Ipycparser-master/utils/fake_libc_include/', r'-Ipycparser-master/utils/fake_libc_include/sys/'])

# Funktioniert nicht
ast = parse_file(filePath, use_cpp=True, cpp_args='%s' %self.headers)

# Funktioniert nicht
ast = parse_file(filePath, use_cpp=True, cpp_args=self.headers)
Fehlermeldung:

Code: Alles auswählen

Datei 1 gefunden (/home/harald/Arbeitsfläche/Prototyp/helloWorld.c)
cpp: Fehler: r'-Ipycparser-master/utils/fake_libc_include/', r'-Ipycparser-master/utils/fake_libc_include/sys/': Datei oder Verzeichnis nicht gefunden
cpp: Warnung: »-x c« hinter letzter Eingabedatei hat keine Wirkung
cpp: schwerwiegender Fehler: keine Eingabedateien
Kompilierung beendet.

mfg Harald
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

der Name des Parameters (»cmd_args«) suggeriert ja schon, dass eine Liste mit Argumenten erwartet wird. Weder Fall 2 noch Fall 3 übergeben allerdings eine Liste. Auch wäre mir keine Funktion bekannt, die mit der Repräsentation einer Liste etwas sinnvolles anfangen kann (Außer vielleicht »eval« :P ).
Um es deutlicher zu sagen. In »self.headers« steht Quatsch drin, schau Dir einfach mal den Typ dieser Variable an.
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Hi
Also ich hätte eigentlich gedacht das wenn ich die zweite Variante nehme das er dann einfach den String der in self.headers drinnen steht dort hinschreibt und die Funktion ihn dann rictig interpretiert. Wenn ich nun aber eine Liste mache und jeden Pfad in diese Liste einfüge dann sollte es doch gehen oder?

mfg Harald
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

harald hat geschrieben:Also ich hätte eigentlich gedacht das wenn ich die zweite Variante nehme das er dann einfach den String der in self.headers drinnen steht dort hinschreibt und die Funktion ihn dann rictig interpretiert.
Das wäre ein unglaublich schlechtes Verhalten. Dann müsste der Interpreter irgendwie entscheiden, welche Variante er denn nun gerade in diesem konkreten Fall wählen sollte.
harald hat geschrieben:Wenn ich nun aber eine Liste mache und jeden Pfad in diese Liste einfüge dann sollte es doch gehen oder?
Das schöne ist ja, dass man solche Sachen einfach ausprobieren kann und daraus lernt ;-)
Das Leben ist wie ein Tennisball.
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Hi
So ich bin nun schon relativ Weit mit den Parser und kann auch schon meine Funktionen erkennen. Nun dachte ich mir eigentlich das ich in einer Datei an eine bestimmte Zeile springen kann und dort die vorhandene Zeile mit einer neuen (die länger oder kürzer ist) ersetzen kann. Allerdings geht das anscheinend doch nicht und so habe ich gelesen das ich eine temporäre Datei erstellen muss in die ich den neuen Code reinschreibe und die dann umbennene zum Beispiel. Ich hoffe ich ihre mich nicht was das angeht den eigentlich würde ich lieber nur in der aktuellen Datei die Zeile ersetzen. Sollte das doch gehen bitte um Antwort.

Nun habe ich also zwei Ansätze:

1) Die alte Datei Zeilenweise in eine neue kopieren und die jeweiligen Zeilen einfach ersetzen. Danach die alte datei löschen und die neue umbenennen.

2) Die datei mit readlines() einlesen und in eine Liste Spiechern. In der Liste die jeweiligen Zeilen ändern und danach mit writelines() die liste wieder rausschreiben.

Nachdem vermutlich beide Varianten funktionieren habe ich mir überlegt das für mich die zweite Variante leichter zu implementieren wäre aber da ich dann eine Liste brauche die den kompletten Inhalt der Datei speichert ist die Frage welche der beiden Varianten besser ist in Bezug auf Performance?! Vielleicht habt ihr ja einen Rat dazu?

mfg Harald
BlackJack

@harald: Die sollten sich von der Performance nicht viel nehmen, aber die erste Variante ist etwas sicherer denn man hat immer mindestens eine der Varianten vorher/nachher komplett auf der Festplatte. Wenn also irgendetwas dummes passiert ist der Quelltext noch komplett vorhanden. Das löschen des alten Quelltextes kann man sich übrigens sparen, das ist beim Umbenennen in einen schon vorhandenen Dateinamen ja schon inbegriffen, dass die vorherige Datei mit dem Namen dann nicht mehr über diesen Namen erreichbar ist.
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Hi
Danke für die Antwort. Ich habe nun mal mit der Implementierung der 2 Version begonnen. Dabei ist ja auch immer eine vollständige und richtige Datei vorhanden. Erst wenn die Liste rausgeschrieben wird verschwindet die alte Version. Alles Dateien werden aber im vorhinein sowieso gezippt um immer ein Backup zu haben.
mfg Harald
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

harald hat geschrieben:Hi
Erst wenn die Liste rausgeschrieben wird verschwindet die alte Version.
Und genau dabei kann dann etwas schief laufen und man hat *keine* vollständige Datei mehr ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Schon klar aber das merkt man dann wenn der Code kompiliert wird. Und im Notfall ist das Backup im Zip File vorhanden.
Antworten