创建子包而不隐藏全局包
Create sub package without shadowing a global package
我正在处理一个 Python 项目,我必须在其中与 Jira API 进行通信。我想为 Python 使用 "offical" 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
company/project/datasources/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
目前都是空文件。我和他们一起尝试了很多,但它对我不起作用。这些文件可能是我的问题的关键?
您使用的是 Python 2,它在解析导入的方式上存在一些问题。它认为 jira
指的是相对于当前模块的 jira
模块(在这种情况下,它们指的是同一件事,但是如果您接下来也尝试从另一个模块导入,也会发生这种情况至 jira.py
).
您需要启用 Python 3 的导入行为。在 jira.py
中的任何其他内容之前添加以下导入(或在同一级别的任何其他会看到阴影包的内容):
from __future__ import absolute_import
有关详细信息,请参阅 PEP 328。摘要描述一般问题:
Imports can be ambiguous in the face of packages; within a package, it's not clear whether import foo
refers to a module within the package or some module outside the package. (More precisely, a local module or package can shadow another hanging directly off sys.path
.)
It is proposed that all import statements be absolute by default (searching sys.path
only) with special syntax (leading dots) for accessing package-relative imports.
我正在处理一个 Python 项目,我必须在其中与 Jira API 进行通信。我想为 Python 使用 "offical" 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
company/project/datasources/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
目前都是空文件。我和他们一起尝试了很多,但它对我不起作用。这些文件可能是我的问题的关键?
您使用的是 Python 2,它在解析导入的方式上存在一些问题。它认为 jira
指的是相对于当前模块的 jira
模块(在这种情况下,它们指的是同一件事,但是如果您接下来也尝试从另一个模块导入,也会发生这种情况至 jira.py
).
您需要启用 Python 3 的导入行为。在 jira.py
中的任何其他内容之前添加以下导入(或在同一级别的任何其他会看到阴影包的内容):
from __future__ import absolute_import
有关详细信息,请参阅 PEP 328。摘要描述一般问题:
Imports can be ambiguous in the face of packages; within a package, it's not clear whether
import foo
refers to a module within the package or some module outside the package. (More precisely, a local module or package can shadow another hanging directly offsys.path
.)It is proposed that all import statements be absolute by default (searching
sys.path
only) with special syntax (leading dots) for accessing package-relative imports.