Seite 1 von 1

execfile bringt in Funktion Fehler

Verfasst: Donnerstag 2. November 2006, 16:44
von marc76
Hallo,
ich habe folgendes Problem wenn ich aus meinem Py-Skript auf Variablen eines anderes Skripts zugreifen will.
Führe ich folgenden Code aus funktioniert alles:

Code: Alles auswählen

dateiname = "datei.py"
execfile(dateiname)
print dateiVariable
Die Variable "dateiVariable" wird also korrekt ausgegeben.

Fürhe ich das Skript als Funktion aus ist "dateiVariable" jedoch unbekannt:

Code: Alles auswählen

def myfunc(dateiname):
    execfile(dateiname)
    print dateiVariable

Code: Alles auswählen

myfunc("datei.py")
Als Fehlermeldung bekomme ich: NameError: global name 'dateiVariable' is not defined

Kann ich dem execfile in der Funktion irgendwie klar machen, dass das funktionieren soll ;)

Danke und Gruß,
Marc

Verfasst: Donnerstag 2. November 2006, 16:46
von Leonidas
Wie wärs wenn du statt execfile das an der Stelle angebrachte import verwendest? Das löst das Problem noch viel eleganter und zuverlässiger.

Verfasst: Donnerstag 2. November 2006, 16:51
von marc76
Leonidas hat geschrieben:Wie wärs wenn du statt execfile das an der Stelle angebrachte import verwendest? Das löst das Problem noch viel eleganter und zuverlässiger.
Hab ich auch schon probiert gehabt aber war das gleiche in grün :(

Code: Alles auswählen

def myfunc(dateiname):
    import(dateiname)
    print dateiVariable

Verfasst: Donnerstag 2. November 2006, 16:57
von Leonidas
marc76 hat geschrieben:Hab ich auch schon probiert gehabt aber war das gleiche in grün :(

Code: Alles auswählen

def myfunc(dateiname):
    import(dateiname)
    print dateiVariable
Du solltest definitiv etwas mehr über Python lernen, das import-Statement ist ziemlich basic:

Code: Alles auswählen

from dateiname import dateiVariable
print dateiVariable
Erklärung ist zum Nachlesen im Wiki: [wiki]Import[/wiki]

Verfasst: Donnerstag 2. November 2006, 17:19
von marc76
Leonidas hat geschrieben:Du solltest definitiv etwas mehr über Python lernen, das import-Statement ist ziemlich basic:

Code: Alles auswählen

from dateiname import dateiVariable
print dateiVariable
Erklärung ist zum Nachlesen im Wiki: [wiki]Import[/wiki]
Joa, bin auch gerade dabei mehr zu lernen, aber im Moment bin ich ja auch erst seit 2 Wochen mit Python in Berührung...

Obwohl ich jetzt den Wiki-Link durchgelesen habe, funktioniert das trotzdem nicht. Hab auch diese __init__.py im Ordner obendrüber erstellt wohin ich die Datei verschoben habe... Dieses Skript, welches ich auslesen muss hat halt folgende Anforderungen: Es kann an beliebeigen Stellen im Netzwerk liegen und soll auswählbar sein, außerdem ist der Inhalt nicht festgelegt sondern soll mehr oder weniger generisch ausgewertet werden...
Ich frag mich jhalt auch, warum meine ursprüngliche Lösung mit execfile funktioniert so lange ich keine Funktion benutze :(
Bin über jede Hilfestellung dankbar; ist ja nicht so dass ich nicht selbst ausprobiere und mich einlese...

Gruß

Verfasst: Donnerstag 2. November 2006, 17:33
von murph
also eigentlich benutzt man execfile einfach nicht, für so etwas importiert man eine datei, oder man lässt sie über das modul subprocess laufen...

Verfasst: Freitag 3. November 2006, 13:12
von marc76
so habs jetzt anders gelöst... hab das File pyhsikalisch geöffnet, eingelesen und dann mit exec() ausgeführt; die ganzen subprocess-Sachen mit Pipes waren mir für die Aufgabe eine Nummer zu umständlich...

Danke für eure Hilfe

Verfasst: Freitag 3. November 2006, 14:49
von Leonidas
marc76 hat geschrieben:Dieses Skript, welches ich auslesen muss hat halt folgende Anforderungen: Es kann an beliebeigen Stellen im Netzwerk liegen und soll auswählbar sein
Geht ab Python 2.5 durch den PEP 328: Absolute and Relative Imports.