python - Python:在哪里放置外部包?
问题描述
我有一个 Django 项目,它使用了一个我没有pip
在我的 virtualenv 中安装的外部包,而是通过git clone
. 外部包是这样的:印象笔记 Python3 SDK
这是我当前的 Django 项目结构:
➜ (venv:evernote) evernote_bear_project git:(master) tree
.
├── README.md
├── bear2evernote
│ ├── static
│ └── templates
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── libs
│ ├── evernote-sdk-python3
│ (omitted)
│ └── utils
│ ├── __init__.py
│ └── file_utils.py
└── manage.py
我已将此包放在我的 Django 项目文件夹evernote-sdk-python3
中的一个文件夹中。libs
我还将实用程序函数放在一个名为utils
下面的包中libs
现在我知道有很多关于如何构建你的项目的建议,比如这两个:
[1]构建你的项目——Python Hitchhiker 指南
[2] Python 应用程序布局:参考——真正的 Python
而且我也知道 Python 不会强迫你使用教条式的文件夹结构。但尽管如此:我对包装、包命名和包结构没有扎实的了解。
将外部包放在我的(Django)项目根文件夹下是一种好习惯吗?
libs
将与我的特定 Django 应用程序无关的所有包/库放在一个名为orutils
or的文件夹中是否有意义src
?
编辑:我也没有看到关于如何使用这些文件夹名称的明确最佳实践:
src
lib
utils
解决方案
一般来说,推荐的工作流程如下:
- 您的 virtualenv 应该已经被排除在版本控制之外(例如使用
.gitignore
or.hgignore
)。如果不是,现在就这样做。 - 在可能的情况下,从 PyPI 将东西安装到您的 virtualenv 中,而不是从 GitHub 或其他地方下载它们。
- 如果您必须在 PyPI 上安装一些东西,请使用参考手册中显示的
git://...
一种形式传递一个类似于 pip install的 URL 。如果您需要固定到特定的提交,也可以传递给安装,并在 URL 中包含提交标识符。否则,依赖项将有效地“处于领先地位”,并且您将来可能无法回到那个确切的提交。-e
- 如果由于某种原因您必须维护其他人项目的本地分支(例如,因为您在其上运行 2to3?),那么按照您的建议去做可能是有意义的。克隆后安装
pip install -e ./libs/libfoo
(或下载,视情况而定)。不建议这样做,因为您需要定期从上游拉入或向后移植更改,这是非常耗费人力的。使用这种方法,版本控制也变得很痛苦,因为您可能没有可用于 3 路合并的上游历史记录(有一些方法可以解决这个问题- 请注意,Linus 显示的命令可能不是目前最好的方法)。 - 一旦你安装了所有你需要的东西,用它
pip freeze
来生成一个 requirements.txt 文件,把这个文本文件粘贴到你的 Django 项目目录中,然后将它检查到版本控制中。该文件应该足以完全从上游源重新生成所有依赖项,而无需将任何依赖项检查到源代码控制中(当然,除非您正在执行 #4)。 - 定期
pip install -U
对较新版本的依赖项进行回归测试并运行回归测试,然后重做pip freeze
并将更改检查到版本控制中。当依赖关系破坏向后兼容性或以其他方式导致问题时,您还可以根据需要手动编辑 requirements.txt 文件。
推荐阅读
- r - 根据原始数据框两列之间的条件创建新数据框
- mysql - Mysql Node.js 查询失败但在工作台中工作
- javascript - react-pdf 从磁盘加载文件但不加载 url
- java - 使用 JAXB 解组字符串 XML 不起作用并且只返回空值
- sql-server - T SQL 距离特定计划开始日期和时间还剩几天或几小时或几分钟
- terraform - Terrafrom 是否允许将新的 EC2 部署到已建立的云基础架构中
- jquery - jQuery Datatable 搜索在使用自动完成字段填充数据和依赖数据时不起作用
- r - R 中的 Cox:我如何解释我收到的奇怪的输出数据?
- git - 如何解释 Tortoise Git Revision Graph?
- c++ - 我是 C++ 的初学者,我想知道如何获得 2D 向量中的重复值