导入本地模块的最佳方法是什么?

时间:2021-05-14 17:06:14

标签: python import pip conda pep

“即使从具有最少假设的父文件夹导入本地包的 PEP 兼容方式是什么”可能是长标题。我正在寻找一种解决方案,可以使用本地包。我的要求:

  1. 它必须与 PEP 兼容,即至少最普遍接受的 PEP 必须支持它
  2. 独立于操作系统、终端、用户和环境,即解决方案不得依赖于任何特定情况

在这些解决方案中,我正在寻找一种

  • 实现起来最简单
  • 修改范围灵活(不需要每次都执行,但不是永久的和系统范围的)
  • 以最简单的形式保留源代码,即解决方案不需要代码中的很多额外行

解决方案

到目前为止,这些是我在 SO 和其他地方找到的方法。它们都不适合我的需要,正如 8 年前所说,every solution will have their cons。但我希望在 2021 年我们可以找到至少满足我的 2 个要求的解决方案。

使用 conda

SO 1

使用 conda 环境并通过 conda develop <path>include a directory in the python lookup path 发出 conda,其中 <path> 可以是相对于密码或绝对的。 Conda 然后在环境的 conda.pth 文件夹中创建一个 site-packages 文件,python 将获得该文件的内容,因此可以在 sys.path

缺点:它需要 conda-build,但并不总是存在。

使用点子

SO 2aSO 2bSO 3

使用pip在本地安装一个包。创建一个 setup.py,配置它,cd 到它所在的位置,然后使用 pip install -e .

以可编辑模式在本地安装包

缺点:PEP 517 不支持 setuptools 中提到的可编辑安装。

直接破解sys.path

SO 2c

直接在 python 脚本中添加到 sys.path 的路径,例如:

import os
import sys

sys.path.insert("path")

import mymodule

这里的路径可以是绝对的或相对的,后者可以是独立于操作系统的,例如通过使用 os.path.sep

缺点:它与 PEP 不兼容,因为并非所有导入语句都位于文件的顶部。 autopep8 会将您的代码重新排列为错误的顺序,但是,are workarounds。可以说这是一个很好的例子,可以忽略 PEP,但我想相信导入已经足够基本,可以毫无例外地应用 PEP。

修改pythonpath

通过向其中添加必要的目录来修改您的系统环境路径或 pythonpath。

缺点:它至少依赖于操作系统并且过于全局化,或者恰恰相反,每次都需要执行它。

使用相对导入

在脚本中,使用相对导入包含模块

from ..somewhere import mymodule

这个不起作用如果这个模块是主要的,你会得到一个

<块引用>

ImportError: attempted relative import with no known parent package

此外,PEP 8 说:“非常不鼓励包内导入的相对导入。” Guido thinks it is ok

相关问题

这与关于如何将模块导入顶级模块之外的一般问题不重复,因为这些问题已经接受了答案。 SO 2SO 3SO 4SO 5 SO 6, not even python

1 个答案:

答案 0 :(得分:0)

正如 PEP8 开头所说:

愚蠢的一致性是小头脑的妖精。

考虑一下,要么将 editable installs 与 pip 一起使用,要么将 develop installs 与 conda 一起使用,
但不要考虑其他黑客之一,因为它们用于不同的目的。