Seite 1 von 1
exec open - file
Verfasst: Freitag 12. September 2014, 11:34
von GoldenerReiter
Hallo,
ich habe wieder ein Problem, welches ich nicht nachvollziehen kann.
Ich habe verschiedene Funktionen geschrieben, welche auch in verschiedene Datein sind.
um diese beim Programmstart zu laden gebe ich folgendes ein
Code: Alles auswählen
motor_path = "D:\\test\motor.py"
slice_path = "D:\\test\Slice.py"
tiling_path = "D:\\test\tiling.py"
exec(open(motor_path).read())
exec(open(slice_path).read())
exec(open(tiling_path).read())
die ersten zwei werden auch akzeptiert,
bei der tiling-Funktion bekomme ich allerdings einen Fehler
Code: Alles auswählen
Traceback (most recent call last):
File "<string>", line 1, in <module>
OSError: [Errno 22] Invalid argument: 'D:\\test\tiling.py'
aber die Funktion ist im selben order (test) wie die anderen Funktionen auch, und funktioniert auch.
Ich verstehe die Fehlermeldung so, dass das argument tiling_path='D:\\test\tiling.py' ungültig ist. Aber wieso funktioniert es dann bei den anderen datein?
Bin über jeden Hinweis sehr dankbar
mfg
Re: exec open - file
Verfasst: Freitag 12. September 2014, 11:47
von pillmuncher
Code: Alles auswählen
>>> print('>\m<')
>\m<
>>> print('>\S<')
>\S<
>>> print('>\t<')
> <
>>> print('>\\m<')
>\m<
>>> print('>\\S<')
>\S<
>>> print('>\\t<')
>\t<
Re: exec open - file
Verfasst: Freitag 12. September 2014, 11:50
von cofi
Das Stichwort lautet "Escape Sequences":
https://docs.python.org/2.7/reference/l ... g-literals
Konkret hast du bei `tiling_path` einen Tabulator im Pfad: `\t`. Das ist 1 Zeichen und nicht 2.
Die Loesung dafuer (und fuer alle Backslashes) ist den Backslash zu escapen, also `\\t` statt `\t` zu benutzen.
Um das zu vereinfachen gibt es auch noch so genannte Raw-Strings: `r"D:\\test\tiling.py"` damit wird automatisch jeder Backslash escaped.
Dann Bleibt noch die Frage, warum du `exec` benutzt statt die Module einfach zu importieren.
Re: exec open - file
Verfasst: Freitag 12. September 2014, 11:55
von Hyperion
cofi hat geschrieben:
Dann Bleibt noch die Frage, warum du `exec` benutzt statt die Module einfach zu importieren.
+1 (oder besser +1000

)
Re: exec open - file
Verfasst: Freitag 12. September 2014, 12:12
von GoldenerReiter
ahh!
da hätte ich ja lange suchen können. Hatte die datei schon in "Tiling.py" umbenannt. da hat es dann funktioniert. habe es aber wieder geändert und ein \\ gemacht.
zunächst wollte ich das auch mit dem import machen, dass hat aber auch nicht funktioniert.
schreibe ich
bekomme ich als fehlermeldung:
TypeError: 'tiling' object is not callable
oder
bekomme ich:
ImportError: No module named 'tiling.py'; 'tiling' is not a package
Das selbe für die anderen Funktionen natürlich auch
Da das mit dem exec funktioniert hat (bis auf die eine funktion) habe ich das gemacht
Re: exec open - file
Verfasst: Freitag 12. September 2014, 12:23
von cofi
Die Fehlermeldung passt nicht zum Code, bitte zeige den kompletten Traceback!
Und wenn du tatsaechlich erwartet hast, dass `import tiling.py` funktioniert, dann solltest du (noch einmal) das Python Tutorial lesen.
Re: exec open - file
Verfasst: Freitag 12. September 2014, 12:25
von Hyperion
Wenn Deine Datei ``Tiling.py`` heißt, dann muss der Import eben ``import Tiling`` lauten - also mit *großem* "T"
Und ja, *das* ist der Weg, wie man Module in Python verwendet. Du importierst in Deinen Programmen sicherlich auch Module, oder? Alles andere sind Sonderwege, die man nur im Sonderfall wählen sollte - also fast *nie*!
Re: exec open - file
Verfasst: Freitag 12. September 2014, 12:36
von BlackJack
@GoldenerReiter: Die erste Fehlermeldung bekommst Du wenn Du nach dem Import versuchst `tiling` aufzurufen. Und wie die Meldung verrät ist `tiling` ein Modul und Module kann man nicht aufrufen. Du hast da zwei Dinge die Du `tiling` genannt hast: Das Modul und eine Funktion *in* dem Modul. Also entweder mit ``tiling.tiling()`` aufrufen oder explizit nur die Funktion aus dem Modul importieren: ``from tiling import tiling``.
Eine Funktion pro Modul klingt auch nach einer etwas komischen Aufteilung. Des weiteren ist `slice` der Name eines eingebauten Datentyps.