exec open - file

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.
Antworten
GoldenerReiter
User
Beiträge: 17
Registriert: Montag 14. Juli 2014, 16:13

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Code: Alles auswählen

>>> print('>\m<')
>\m<
>>> print('>\S<')
>\S<
>>> print('>\t<')
>       <
>>> print('>\\m<')
>\m<
>>> print('>\\S<')
>\S<
>>> print('>\\t<')
>\t<
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

cofi hat geschrieben: Dann Bleibt noch die Frage, warum du `exec` benutzt statt die Module einfach zu importieren.
+1 (oder besser +1000 :mrgreen: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
GoldenerReiter
User
Beiträge: 17
Registriert: Montag 14. Juli 2014, 16:13

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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*!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
Antworten