2008-12-15 21 views
9

"mylibrary" adlı bir paket var.Sys.modules üzerinden sanal paket oluşturma

Ben ithalatı için "mylibrary.config" kullanılabilir duruma getirmek istediğiniz, ya bir dinamik olarak oluşturulan modül veya sonra temelde olacağını tamamen farklı bir yerden ithal modül olarak "MyLibrary" isim alanı içinde "monte".

Yani, yapacak:

>>> import mylibrary.config # -> works 

>>> from mylibrary import config 
<type 'exceptions.ImportError'>: cannot import name config 

Hatta yabancı:

>>> import mylibrary.config as X 
<type 'exceptions.ImportError'>: cannot import name config 

yüzden o doğrudan ithalat işleri kullanarak, diğer formları gibi görünüyor kurulum o

import sys, types 
sys.modules['mylibrary.config'] = types.ModuleType('config') 

Verilen yapma. Bu işleri de yapmak mümkün mü?

cevap

13

Sen sys.modules içine değil, aynı zamanda kendi üst modüle sadece maymun yama modülü gerekir:

>>> import sys,types,xml 
>>> xml.config = sys.modules['xml.config'] = types.ModuleType('xml.config') 
>>> import xml.config 
>>> from xml import config 
>>> from xml import config as x 
>>> x 
<module 'xml.config' (built-in)> 
1

Böyle bir şey deneyebilirsiniz:

class VirtualModule(object): 
    def __init__(self, modname, subModules): 
    try: 
     import sys 
     self._mod = __import__(modname) 
     sys.modules[modname] = self 
     __import__(modname) 
     self._modname = modname 
     self._subModules = subModules 
    except ImportError, err: 
     pass # please signal error in some useful way :-) 
    def __repr__(self): 
    return "Virtual module for " + self._modname 
    def __getattr__(self, attrname): 
    if attrname in self._subModules.keys(): 
     import sys 
     __import__(self._subModules[attrname]) 
     return sys.modules[self._subModules[attrname]] 
    else: 
     return self._mod.__dict__[attrname] 


VirtualModule('mylibrary', {'config': 'actual_module_for_config'}) 

import mylibrary 
mylibrary.config 
mylibrary.some_function 
1

yanı sıra aşağıdaki:

import sys, types 
config = types.ModuleType('config') 
sys.modules['mylibrary.config'] = config 

Ayrıca yapmanız gerekir:

import mylibrary 
mylibrary.config = config