从“错误”命名的目录导入包
impala的Python项目详细描述
Author: | Roman Neuhauser |
---|---|
Contact: | neuhauser@sigpipe.cz |
Copyright: | This document is in the public domain. |
概述
impala是一个PEP302协议(sys.meta_pathhook,用于import 语句)实现允许用户导入包和 来自任意命名目录和文件的模块。
动机
- 发展中的舒适与自由
- 无需安装即可使用已安装的接口
假设我正在开发一个名为pyoneer的python包。我想 按如下方式排列源代码:
README.txt src/ __init__.py some.py more.py tests/ ...
问题是,如何在测试文件中import pyoneer。 (<workdir>/tests/...)并加载<workdir>/src/__init__.py? 默认的import机制要求包以同名形式存在 目录。
你问,有什么好大惊小怪的?我应该简单地重命名src 目录到pyoneer或者src/pyoneer,不是吗?
实际上,这是可以容忍的,至少在顶级软件包中是这样。 但是,如果我正在做一些可以作为 foo.bar.baz安装后,我当然不想涉水 通过荒凉的src/foo/bar获得源代码。
或许我可以在测试中import src?嗯,测试是 文档的一种形式,对于doctest更是如此。“适当的” 文档(readme.txt等)也可以包含 应该可以在不安装切口的情况下进行验证。
impala去救援!
from os.path import abspath, dirname import impala root = abspath(dirname(__file__)) impala.register(dict( pyoneer = '%s/src' % root )) import pyoneer
说明
impala.register(aliases)
aliases是来自完全限定模块/包的dict映射 要从中加载的路径的名称。从路径导入包p。 /a/b/c,aliases必须包含具有关联值的键p。 /a/b/c和/a/b/c/__init__.py必须是有效的包条目 要点。要从路径/f/g/h.py导入模块m,必须aliases。 包括键m和关联的值/f/g/h.py。
示例:
from os.path import abspath, dirname import impala r = dirname(abspath(__file__)) impala.register({ 'p': '%s/a/b/c' % r, 'p.q': '%s/f/g/h' % r, 'p.q.m': '%s/k.py' % r, }) import p import p.q import p.q.m
许可证
py impala分布在MIT license下。见LICENSE 详细情况。