使用__init__.py加载动态python模块的问题

时间:2011-05-10 21:24:10

标签: python module loading instantiation init

我正在尝试加载模块并实例化dinamically内部同名类__init__.py。使用像

这样的文件树
 importer/
     __init__.py         # The file i'm writing
     asd.py              # It contains class asd
     bsd.py              # It contains class bsd

__init__.py

importername=__name__

def load(modname,paramlist = []):

  if modname in globals():
    print 'Module %s already loaded.' % (modname)
  else:
    imported_mod = __import__(importername + '.' + modname, fromlist = ["*"])
    try:
        globals()[modname]=getattr(imported_mod,modname)(*paramlist)
    except Exception, e:
        print 'Module %s not loaded: %s.' % (modname, e)

如果我跑

import importer
importer.load('asd')
print importer.asd.name
'ASD!'

它就像一个魅力,但如果我运行

from importer import *
load('asd')
print asd.name
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'asd' is not defined

我能以某种方式修复它吗?谢谢。

1 个答案:

答案 0 :(得分:1)

在Python中没有真正的全局性。在importer/__init__.py中使用globals()时,您正在访问模块的命名空间。您的第二个非工作样本是将'asd'添加到导入程序,而不是添加到您的测试模块。

你可以做的最好是修改导入器,这样你就可以:

from importer import *
asd = load('asd')
print asd.name

但正如Thomas K所暗示的那样:这有点奇怪,也许有一种更简单的方法来解决你的问题?