python - 避免使用 `sys.path.append(..)` 进行导入
问题描述
这不是我第一次imports
在 Python 中畏缩。但我想这是一个有趣的用例,所以我想在这里问它以获得更好的洞察力。我的项目结构如下:
sample_project
- src
- __init__.py
- module1
- __init__.py
- utils.py
- module2
- __init__.py
- models.py
- app.py
从所有其他的module1
导入方法module2
和导入方法。app
此外,当您运行它时,app
它需要在文件夹logs
之外创建一个名为的src
文件夹。现在有运行应用程序的方法:
- 从里面的
src
文件夹flask run app
- 从
src
文件夹外部flask run src.app
为了确保我不会import errors
因为启动应用程序的顶级模块的更改而得到,我这样做:
import sys
sys.path.append("..")
这个问题有更好的解决方案吗?
解决方案
导入问题的Pythonic 解决方案是不要将 sys.path(或间接 PYTHONPATH)hack添加到任何可能用作顶级脚本(包括单元测试)的文件中,因为这会使您的代码库难以更改和维护。假设您必须重新组织项目结构或重命名文件夹。
相反,这是editable installs
为之而生的。它们可以通过两种方式实现:
- pip install --editable
<path>
(需要基本的 setup.py) - conda develop
<path>
(需要conda-build
软件包)
无论哪种方式都会将符号链接添加到您的站点包文件夹中,并使您的本地项目表现得好像它已完全安装,同时您可以继续编辑。
永远记住:让事情容易改变
推荐阅读
- node.js - Cheerio 绊倒在带有冒号的标签上
- sql-server - 在输出消息中添加有关 PK 值的信息 - 更容易找到有缺陷的记录
- angular - 声纳:检查 node_modules 时 TFS“发布质量门结果”任务失败
- python - 如何组合功能,使它们更通用
- angular - 用于 SSR 的 Angular 7 Cookie(通用)
- php - 如何在 Laravel 5.7 中反转这种关系
- mysql - 我有一个有点复杂的 SQL 语句,但我不知道在哪里放置 WHERE 子句
- c++ - 为什么 getxattr 会填充额外的元素?
- javascript - 反应引导导航栏切换不显示
- openedge - PDSOE 自定义工具栏选项“发送当前选择的文件名”与多选?