我想通过以下方式动态导入模块:
我创建一个名为 pkg 的文件夹,其结构如下:
pkg
|__init__.py
|foo.py
在头__init__.py
,添加此代码片段:
pkgpath = os.path.dirname(pkg.__file__);
for module in pkgutil.iter_modules([pkgpath]):
__import__(module[1], locals(), globals());
m = sys.modules[module[1]];
print m.__package__;
I found m.__package__
is None
如果 foo.py 中没有 import 语句
但如果我添加一个简单的导入语句,如下所示:
import os
then m.__package__
是“pkg”,这是正确的包名称。
为什么会发生这种情况?
如何导入模块并确保其包属性正确?
The __package__
正如您所注意到的,属性的设置不一致。 (更多信息在底部。)但是,您应该始终能够通过获取模块中最后一个句点之前的所有内容来获取包名称。__name__
属性。例如。mymod.__name__.rpartition('.')[0]
。不过,出于您的目的,在加载模块时构建包/模块层次结构可能会更容易。
例如,这是一个加载包内所有模块、递归加载子包内模块等的函数。(我假设您不介意具有副作用的函数..)
import sys
import pkgutil
from os.path import dirname
def loadModules(pkg):
pkg._modules = []
pkgname = pkg.__name__
pkgpath = dirname(pkg.__file__)
for m in pkgutil.iter_modules([pkgpath]):
modulename = pkgname+'.'+m[1]
__import__(modulename, locals(), globals())
module = sys.modules[modulename]
module._package = pkg
# module._packageName = pkgname
pkg._modules.append(module)
if dirname(module.__file__) == pkgpath:
module._isPackage = False
else:
module._isPackage = True
loadModules(module)
def modName(mod):
return mod.__name__.rpartition('.')[-1]
def printModules(pkg, indent=0):
print '\t'*indent, modName(pkg), ':'
indent += 1
for m in pkg._modules:
if m._isPackage:
printModules(m, indent)
else:
print '\t'*indent, modName(m)
import dummypackage
loadModules(dummypackage)
printModules(dummypackage)
示例输出:
dummypackage :
modx
mody
pack1 :
mod1
pack2 :
mod2
更多信息:
The __package__
属性由导入系统内部使用,以允许在包内轻松进行相对导入。详细信息请参见PEP 366 http://www.python.org/dev/peps/pep-0366/。为了(大概)节省加载模块的时间,仅当加载的模块导入另一个模块时才设置该属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)