“即使从具有最少假设的父文件夹导入本地包的 PEP 兼容方式是什么”可能是长标题。我正在寻找一种解决方案,可以使用本地包。我的要求:
在这些解决方案中,我正在寻找一种
到目前为止,这些是我在 SO 和其他地方找到的方法。它们都不适合我的需要,正如 8 年前所说,every solution will have their cons。但我希望在 2021 年我们可以找到至少满足我的 2 个要求的解决方案。
使用 conda 环境并通过 conda develop <path>
向 include a directory in the python lookup path 发出 conda,其中 <path>
可以是相对于密码或绝对的。 Conda 然后在环境的 conda.pth
文件夹中创建一个 site-packages
文件,python 将获得该文件的内容,因此可以在 sys.path
缺点:它需要 conda-build,但并不总是存在。
使用pip在本地安装一个包。创建一个 setup.py
,配置它,cd 到它所在的位置,然后使用 pip install -e .
缺点:PEP 517 不支持 setuptools 中提到的可编辑安装。
sys.path
直接在 python 脚本中添加到 sys.path
的路径,例如:
import os
import sys
sys.path.insert("path")
import mymodule
这里的路径可以是绝对的或相对的,后者可以是独立于操作系统的,例如通过使用 os.path.sep
。
缺点:它与 PEP 不兼容,因为并非所有导入语句都位于文件的顶部。 autopep8 会将您的代码重新排列为错误的顺序,但是,are workarounds。可以说这是一个很好的例子,可以忽略 PEP,但我想相信导入已经足够基本,可以毫无例外地应用 PEP。
通过向其中添加必要的目录来修改您的系统环境路径或 pythonpath。
缺点:它至少依赖于操作系统并且过于全局化,或者恰恰相反,每次都需要执行它。
在脚本中,使用相对导入包含模块
from ..somewhere import mymodule
这个不起作用如果这个模块是主要的,你会得到一个
<块引用>ImportError: attempted relative import with no known parent package
此外,PEP 8 说:“非常不鼓励包内导入的相对导入。” Guido thinks it is ok。
这与关于如何将模块导入顶级模块之外的一般问题不重复,因为这些问题已经接受了答案。 SO 2、SO 3、SO 4、SO 5 SO 6, not even python
答案 0 :(得分:0)
正如 PEP8 开头所说:
愚蠢的一致性是小头脑的妖精。
考虑一下,要么将 editable installs
与 pip 一起使用,要么将 develop installs
与 conda 一起使用,
但不要考虑其他黑客之一,因为它们用于不同的目的。