- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想通过以下方式动态导入模块:
我创建了一个名为 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__;
我发现 m.__package__
是 None
以防 foo.py 中没有导入语句但是如果我像这样添加一个简单的导入语句:
import os
那么 m.__package__
就是“pkg”,这是正确的包名。为什么会这样?
如何导入模块并确保其包属性正确?
最佳答案
如您所见,__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
更多信息:
__package__
属性由导入系统内部使用,以允许在包内轻松进行相对导入。有关详细信息,请参阅 PEP 366 .为了(大概)在加载模块时节省时间,仅当加载的模块导入另一个模块时才设置该属性。
关于python - 导入 Python 模块时 __package__ 为 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4437394/
如果在我的代码中,我会调用如下: __PACKAGE__->method; 如果这个模块是继承的,这会限制这个模块的可用性吗? 最佳答案 这取决于你想做什么: #!/usr/bin/perl pack
我正在重构遗留代码中的 perl 模块,这是模块中的一个函数: sub get_user { my $user = __PACKAGE__->{user}; if (!defined
我在 setup.py 中使用 __package__ 来引用它应该测试、构建、安装等的包的顶级名称。但是,pylint 对象: Module 'mian.mian' has no '__packag
我只想知道__package__ 到底是什么意思?在官方文档中没有找到任何解释,即使在 SO 上也是如此。 如果你能提供一些例子,我会很高兴。 最佳答案 见 PEP 366和 import syste
在这个 earlier Stackoverflow question尤其是 brian d foy's "How a Script Becomes a Module"我已经阅读了如何设置代码,以便它可
我希望我知道告诉我这是在 Perl 中创建新对象的最佳方法的引用或文档: sub new { my $package = shift; my $class = ref($package)
我想通过以下方式动态导入模块: 我创建了一个名为 pkg 的文件夹,结构如下: pkg |__init__.py |foo.py 在__init__.py的头部,添加如下代码片段: pkg
我读了很多帖子,与这个问题相关的PEP文章,大约有4篇,但是没有一篇在某些点上给出了清晰的想法,我仍然无法进行相对导入。 事实上,我的主包中的内容根本没有列出。 重新编辑。我把帖子全部修改了,太复杂了
我在一个类中有一个方法,我需要确保它只在对象实例上调用,而不是作为类方法。 我可能会做这样的事情: # Edit: this is terrible, don't do this, it breaks
我是一名优秀的程序员,十分优秀!