execfile bringt in Funktion Fehler

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
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

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ß
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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...
http://www.cs.unm.edu/~dlchao/flake/doom/
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten