从“错误”命名的目录导入包

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/caliases必须包含具有关联值的键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 详细情况。

安装

使用来自PyPIpip,python包索引:

pip install impala

checkout或提取的tarball:

python setup.py install

开发

源代码和问题跟踪程序位于github:

https://github.com/roman-neuhauser/py-impala

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何打印JTextPane页脚中的总页数?   java“未能从TestExample加载MainClass清单属性”。罐子   JTabbedPane的java问题   java在应用程序中使用身份验证设置时获得401响应   angularjs我需要添加一个等待,直到我通过seleniumjava收到AngularHTTP请求的响应   把一个集合分成更小的集合   java Eclipse插件如何在操作保存时附加方法   基于开源Java或Ruby Web的虚拟教室组件?   有人能帮我解决在JavaSwing中显示PDF的代码中的错误吗?   java如何在jxpath中实现昂贵的查询?   java静态工厂方法每次调用时都会创建一个新对象   java在这个DFS递归函数中,深度+1和深度++有什么区别?   java XX:OnAutofmemoryError=“kill 9%p”问题