创建子包而不遮蔽全局包

时间:2015-06-12 18:54:54

标签: python python-2.7 python-jira

我正在开发一个Python项目,我将与Jira API进行通信。我想使用"官方"适用于Python的Jira客户端here

该软件包引入了全局命名空间jira,这意味着您必须

from jira import JIRA

使用API​​。

如何创建子包

company.project.datasources.jira

不影响全局jira包裹?

让我添加一些步骤来重现我的问题并展示我的想法:

这是我的目录布局:

.
├── company
│   ├── __init__.py
│   └── project
│       ├── datasources
│       │   ├── __init__.py
│       │   └── jira.py
│       └── __init__.py
└── test.py

公司/项目/数据源/ jira.py

# This should be the global class. I don't know how to import it
from jira import JIRA as BaseJira

class JIRA(BaseJira):
    # Add something fancy here
    pass

test.py

from company.project.datasources.jira import JIRA

custom_jira = JIRA()

当我尝试:

python test.py

我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from company.project.datasources.jira import JIRA
  File "/tmp/test/company/project/datasources/jira.py", line 2, in <module>
    from jira import JIRA as BaseJira
ImportError: cannot import name JIRA

__init__.py目前都是空文件。我和他们一起尝试了很多,但它对我没用。这些文件可能是我问题的关键吗?

1 个答案:

答案 0 :(得分:4)

您正在使用Python 2,它在解决导入方面存在一些问题。它认为jira是指相对于当前模块的jira模块(在这种情况下,它们指的是相同的东西,但如果您还尝试从另一个模块执行此导入,也会发生这种情况到jira.py)。

您需要启用Python 3的导入行为。在jira.py中的任何其他内容之前添加以下导入(或者在与查看阴影包的同一级别的任何其他内容):

from __future__ import absolute_import

有关详细信息,请参阅PEP 328。摘要描述了一般问题:

  

面对包装,进口可能含糊不清;在一个包中,不清楚import foo是指包中的模块还是包外的某个模块。 (更确切地说,本地模块或包可以直接隐藏另一个挂起sys.path。)

     

建议所有import语句在默认情况下都是绝对的(仅使用sys.path搜索),使用特殊语法(前导点)来访问包相对导入。