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

1 投票
1 回答
1348 浏览
提问于 2025-04-16 17:23

我正在尝试制作一个 __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 个回答

2

在Python中,实际上并没有真正的全局变量。当你在importer/__init__.py中使用globals()时,你其实是在访问这个模块的命名空间。你第二个不工作的例子是把'asd'加到了importer模块,而不是你的测试模块。

你能做的最好的事情就是修改importer,这样你就可以这样做:

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

但是正如Thomas K所建议的:这样做有点奇怪,也许还有更简单的方法来解决你的问题呢?

撰写回答