【发布时间】:2017-12-12 03:11:06
【问题描述】:
背景:
我有一个这样的目录结构:
Package/
setup.py
src/
__init__.py
__main__.py
code.py
我希望能够以多种不同的方式运行代码。
pip install Package然后python然后from Package import *python -m Package应该做__main__.py中的事情python __main__.py也应该在__main__.py中执行此操作,但是这一次,我们假设您已下载源而不是pip installing。
现在我已经完成了前两个工作,但是设置很混乱:
setup.py:
setup(
name='Package',
packages=['Package'],
package_dir={'Package': 'src'},
...
entry_points={ 'console_scripts': ['Package = src.__main__:main' ] }
__init__.py:
from Package.code import .......
__main__.py:
from . import .......
对我来说更有意义的是在这两种情况下都写
from code import ........
但这给了我导入错误。
问题:
我拥有它的方式真的是唯一的方式吗?
最重要的是,我如何支持第三个用例?现在,python __main__.py 抛出
File "__main__.py", line 10, in <module>
from . import code
ImportError: cannot import name 'class defined in code.py'
注意事项:
我读过
【问题讨论】:
-
from code import是不推荐的隐式相对导入(并且在 Python 3 中不起作用)。使用绝对导入或显式相对导入。 -
@phd 你能详细说明一下它们是什么吗?
-
绝对导入意味着使用完整路径:
from Package.somemodule.submodule import即使在 Package 或 somemodule 中。相对导入是从邻居导入而不使用完整路径。from code import是隐式 rel。导入,因为它看起来像绝对但实际上是相对的。相对导入是 Python 2 中的默认模式,但它的隐式模式现在在 Python 3 中被禁止(默认现在是绝对导入)。显式相对导入是from .code import— 见.code中的点?意思是“从当前模块导入”。 -
知道了,所以现在我们应该一直这样做
from Package.somemodule.submodule import? -
这是 PEP8 推荐的(虽然官方 PEP8 仅适用于 stdlib)。
标签: python pip setuptools