将子目录添加到python命名空间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将子目录添加到python命名空间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2273字,纯文字阅读大概需要4分钟。
内容图文
![将子目录添加到python命名空间](/upload/InfoBanner/zyjiaocheng/777/a08fc512642e4fd399208111fb8e7b3d.jpg)
我希望能够导入一个实际位于另一个模块的子目录中的python模块.
我正在开发一个带插件的框架.
由于我预计会有几千(目前已经有250个)并且我不想要一个包含> 1000个文件的大目录,我将它们排序在这样的目录中,在那里它们按照第一个字母分组他们的名字:
framework __init__.py
framework.py
tools.py
plugins __init__.py
a __init__.py
atlas.py
...
b __init__.py
binary.py
...
c __init__.py
cmake.py
...
由于我不想给其他插件的开发人员或者不需要我所拥有的插件的人带来负担,我想将每个插件放在’framework.plugins’命名空间中.
这样,添加一堆私有插件的人可以通过在文件夹framework.plugins中添加它们来实现,并提供一个__init__.py文件,其中包含:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
但是,目前这种设置迫使他们也使用a-z子目录.
有时一个插件正在扩展另一个插件,所以现在我有一个
from framework.plugins.a import atlas
而且我想拥有
from framework.pugins import atlas
有没有办法声明名称空间名称实际上不映射到文件夹结构的命名空间?
我知道pkg_resources包,但这只能通过setuptools获得,而我宁愿没有额外的依赖.
import pkg_resources
pkg_resources.declare_namespace(__name__)
该解决方案应该在python 2.4-2.7.3中工作
更新:
结合提供的答案,我试图从插件中获取__init__.py中导入的所有插件的列表.但是,由于依赖性,这会失败.由于’c’文件夹中的插件尝试导入以’t’开头的插件,并且尚未添加此插件.
plugins = [ x[0].find_module(x[1]).load_module(x[1]) for x in pkgutil.walk_packages([ os.path.join(framework.plugins.__path__[0], chr(y)) for y in xrange(ord('a'), ord('z') + 1) ],'framework.plugins.' ) ]
我不确定如果我在这里走上正轨,或者只是过于复杂化并且更好地编写我自己的PEP302导入器.但是,我似乎找不到任何关于这些应该如何工作的正确例子.
更新:
我试图遵循在__init__.py中包装__getattr__函数的建议,但这似乎无济于事.
import pkgutil
import os
import sys
plugins = [x[1] for x in pkgutil.walk_packages([ os.path.join(__path__[0], chr(y)) for y in xrange(ord('a'), ord('z') + 1) ] )]
import types
class MyWrapper(types.ModuleType):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
if name in plugins:
askedattr = name[0] + '.' + name
else:
askedattr = name
attr = getattr(self.wrapped, askedattr)
return attr
sys.modules[__name__] = MyWrapper(sys.modules[__name__])
解决方法:
一个简单的解决方案是在插件.__ init__中导入a,b …模块,如:
from a import atlas
from b import binary
...
内容总结
以上是互联网集市为您收集整理的将子目录添加到python命名空间全部内容,希望文章能够帮你解决将子目录添加到python命名空间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。