python - 导入本地模块的最佳方式是什么?
问题描述
“什么是 PEP 兼容的方式来导入本地包,即使是从具有最少假设的父文件夹中导入”可能是长标题。我正在寻找一种可以使用本地软件包的解决方案。我的要求:
- 它必须是 PEP 兼容的,即至少最普遍接受的 PEP 必须支持它
- 操作系统、终端、用户和环境独立,即解决方案不得依赖于任何特定情况
在这些解决方案中,我正在寻找一个
- 是最简单的实现
- 修改范围灵活(不需要每次都执行,但不是永久的和系统范围的)
- 以最简单的形式保留源代码,即解决方案不需要在代码中添加很多额外的行
解决方案
这些是我到目前为止在 SO 和其他地方找到的方法。它们都不适合我的需求,正如 8 年前所说,每种解决方案都有其缺点。然而我希望在 2021 年我们能找到一个至少满足我的两个要求的解决方案。
使用康达
使用 conda 环境并发出 conda 以在 python 查找路径中包含一个目录,其中conda develop <path>
可以<path>
是相对于 pwd 或绝对的。Conda 然后在环境的文件夹中创建一个conda.pth
文件site-packages
,python 将提供该文件的内容,因此将在sys.path
缺点:它需要 conda-build,但并不总是存在。
使用点子
使用 pip 在本地安装包。创建一个setup.py
,配置它,cd到它所在的位置,然后以可编辑模式在本地安装包pip install -e .
缺点:PEP 517不支持setuptools中提到的可编辑安装。
直接破解sys.path
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 3,SO 4,SO 5 SO 6,甚至没有蟒蛇
解决方案
正如 PEP8 一开始所说:
愚蠢的一致性是小头脑的妖精。
考虑一下,要么editable installs
与 pip 或develop installs
conda 一起使用,
但不要考虑其他黑客,因为它们用于不同的目的。
推荐阅读
- javascript - 同一页面中的多个倒计时
- c++ - OutputDebugString 在 Windows 通用应用程序上的位置在哪里?以及如何从 OutputDebugString 捕获消息?
- webpack - HtmlWebpackPlugin + webpack-dev-server:为什么脚本标签没有注入到本地主机的页面中?
- java - 获取主要活动上下文
- android - Intent.putExtra 不适用于第二个活动
- javascript - WebStorm 对 Polymer 库的支持
- linux - 如何“静默”地从 Linux 上的终端获取用户输入?
- python - 在python中打印不需要的符号
- eclipse - 创建与 Oracle 11g 数据库的 SQL 模型连接连接时出错
- python - 为什么表达式 'a'>'b' 在 Python 中返回 false?