import vs exec code in imp.new_module().__dict__

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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Hi,

hat schon jemand seinen eigenen Importer gebastelt für module die nicht im filesystem liegen, und ist auf das "verhaltensproblem des import statements" gestoßen?

Mein problem ist, das das reguläre scheinbar nicht einfach "return sys.modules[name]" ausführt wenn bereits vorhanden.

Sprich wenn ich ein Modul mit der funktion stringimport importiert habe und irgendwo in einem anderen modul ein "import x" vorkommt, sucht er x im Filesystem (wo es natürlich nicht existiert).

Ich würde gern vermeiden die vielen submodule ändern zu müssen,
daher die Frage, wo vermerkt sich das import statement noch, was bereits importiert ist?

(Ziel: nach ausgeführten 'stringimport(..)' soll ein 'import ..' kein echtes neuimport des moduls versuchen sondern das bereits in sys.modules vorhandene zurückgeben)

Code: Alles auswählen

def stringimport(modulename, code):
    if sys.modules.has_key(modulename):
        return sys.modules[modulename]
    
    m = sys.modules.setdefault(modulename, imp.new_module(modulename))
    m.__file__ = modulename + '.py'
    exec code in m.__dict__
    return m
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

bei mir Funktioniert das:

Code: Alles auswählen

#a.py

import sys
sys.modules['x'] = object()

import b
print b.x

Code: Alles auswählen

#b.py
import x
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Welche Python version nutzt du?

(Bei mir 2.6.4 win32)

Selbst wenn deine Lösung funktioniert, wird laut der import PEPs der weg beschrieben wie ich im originalpost umgesetzt hab (bei mir fehlt allerdings der teil, der das modul wieder austrägt falls ein codefehler passiert).

Gibts irgendwo die import statement ablaufbeschreibung?
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Danke JBS,

neuer sandkastentest meinerseits - es funktioniert.

Jetzt muss ich nur noch rauskriegen warum es in der echten APP nicht funktioniert ...

In der echten APP verwende ich py[c|o] bytecode der erst unmarshalled wird, evtl. gibts dadurch ein problem ....

Allerdings wenn ich per sys.modules[x] darauf zugreife funktioniert es.

:-(

Code: Alles auswählen

>Desktop\testmenow>a.py
<module 'x' from '<dummy>'>
HI THERE

Code: Alles auswählen

#b.py
import x 

Code: Alles auswählen

#a.py

import sys
import imp

m = imp.new_module('x')
m.__file__ = '<dummy>'

sys.modules['x'] = m

m.y = 'HI THERE'


import b
print b.x
print b.x.y
[/code]
Antworten