2

我正在开发一个 Python 项目,我必须与 Jira API 进行通信。我想使用此处提供的 Python 的“官方”Jira 客户端。

该包引入了一个全局命名空间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

测试.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都是空文件。我和他们一起尝试了很多,但对我没有用。可能这些文件是我问题的关键吗?

4

1 回答 1

4

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

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

from __future__ import absolute_import

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

面对包,导入可能是模棱两可的;在包内,不清楚是import foo指包内的模块还是包外的某些模块。(更准确地说,一个本地模块或包可以直接影响另一个悬挂的模块或包sys.path。)

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

于 2015-06-12T19:51:48.947 回答