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.

Code: Alles auswählen

def motor():
...
...

Code: Alles auswählen

def slice():
...
...

Code: Alles auswählen

def tiling():
...
...
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 :mrgreen: )

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

Code: Alles auswählen

import tiling
bekomme ich als fehlermeldung:
TypeError: 'tiling' object is not callable

oder

Code: Alles auswählen

import tiling.py
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.