gpt4 book ai didi

python - 导入 Python 模块时 __package__ 为 None

转载 作者:太空狗 更新时间:2023-10-29 21:38:19 26 4
gpt4 key购买 nike

我想通过以下方式动态导入模块:

我创建了一个名为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com