首页 > 解决方案 > 导入本地模块的最佳方式是什么?

问题描述

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

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

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

解决方案

这些是我到目前为止在 SO 和其他地方找到的方法。它们都不适合我的需求,正如 8 年前所说,每种解决方案都有其缺点。然而我希望在 2021 年我们能找到一个至少满足我的两个要求的解决方案。

使用康达

1

使用 conda 环境并发出 conda 以在 python 查找路径中包含一个目录,其中conda develop <path>可以<path>是相对于 pwd 或绝对的。Conda 然后在环境的文件夹中创建一个conda.pth文件site-packages,python 将提供该文件的内容,因此将在sys.path

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

使用点子

SO 2a , SO 2b , SO 3

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

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

直接破解sys.path

2c

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

import os
import sys

sys.path.insert("path")

import mymodule

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

缺点:它不是 PEP 兼容的,因为不是所有的 import 语句都在文件的顶部。autopep8 会将您的代码重新排列为错误的顺序,但是,有一些解决方法。可以说这是一个可以忽略 PEP 的好例子,但我想相信导入足够基本,可以毫无例外地应用 PEP。

修改python路径

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

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

使用相对进口

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

from ..somewhere import mymodule

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

ImportError: attempted relative import with no known parent package

此外,PEP 8 说:“非常不鼓励内部包装进口的相对进口。” 圭多认为没问题

相关问题

这不是关于如何在顶层之外导入模块的一般问题的重复,因为这些问题已经得到了接受的答案。SO 2​​ SO 3SO 4SO 5 SO 6,甚至没有蟒蛇

标签: pythonimportpipcondapep

解决方案


正如 PEP8 一开始所说:

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

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


推荐阅读