[Python-de] reimport über __import__

Alexander 'boesi' Bösecke boesi.josi at gmx.net
Don Jul 13 12:53:36 CEST 2006


Hi

Oh man mit import und reload kann man sich ja so richtig ins Knie
schiessen. Ich beschreib jetzt einfach mal einfach meine Erfahrungen und
Experimente. Wenn ich Müll verzapfen sollte, korrigiert mich bitte.

> Ich hab das jetzt folgendermaßen gelöst:
>         fp, pathname, description = imp.find_module('WebCap')
>         wc = imp.load_module('WebCap', fp, pathname, description)
> Laut Doku soll zwar load_module das selbe wie reload tun, aber der obige
> Code funktioniert im Gegensatz zu reload. 

Das ist natürlich vollkommener Humbug und funktioniert nur, weil ich
WebCap über 2 Wege importieren kann
1. import pyVideo.WebCap - pyVideo ist ein package
2. import WebCap - in meinem site-packages Verzeichnis ist eine
pth-Datei mit dem Inhalt "pyVideo"

Scheinbar erkennt Python nicht, das es sich hier 2x um das gleiche Modul
handelt.

Im Zusammenhang mit reload stellen sich mir jetzt noch ein paar Fragen.

Wenn Modul1 das Modul2 importiert, wie reloadet man Modul2, wenn Modul1
reloadet wird? Mir fällt dazu nur ein, vor dem Import von Modul2
nachzusehen ob Modul2 in locals enthalten und dann reload zu verwenden.
Das funktioniert aber nicht mehr, wenn Modul2 mit "from Modul2 import *"
importiert wird. In diesem Fall stellt sich aber generell die Frage, wie
Modul2 reloadet wird.

Zwischendurch hatte ich das gelöst, in dem ich im Modul WebCap vor dem
"from CRImage import *" folgendes gesetzt hab:

if 'RImageSDLInstalled' in locals():
    import CRImage
    reload(CRImage)         

Das funktioniert soweit zwar, aber sieht doch ganz schön nach Hack aus
und ist irgendwie gar nicht mehr "python-like"...

Da es ja letzten Endes um den reload von CRImage geht, hab ich das so
gelöst:

import WebCap as wc
...
import CRImage
reload(CRImage)
reload(wc)

Funktioniert seltsamerweise aber nur, wenn ich WebCap und nicht
pyVideo.WebCap importiere. pyVideo.WebCap sieht das reloadete CRImage
nicht.

Eine letzte Frage noch: Im Modul CRImage wird das C-Modul RImageSDLc
importiert, das wird beim reload von CRImage automatisch reloadet - ist
das bei C-Modulen generell so oder nur in diesem speziellen Fall?


cu boesi

PS: Ich weiss, dass reload im Deutschen nicht existiert, aber da
"donwload" ein deutsches Verb ist, hab ich mir mal die Freiheit genommen
reload einzudeutschen...




More information about the python-de mailing list