首页 > 解决方案 > 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 不会强迫你使用教条式的文件夹结构。但尽管如此:我对包装、包命名和包结构没有扎实的了解。

  1. 将外部包放在我的(Django)项目根文件夹下是一种好习惯吗?

  2. libs将与我的特定 Django 应用程序无关的所有包/库放在一个名为or utilsor的文件夹中是否有意义src


编辑:我也没有看到关于如何使用这些文件夹名称的明确最佳实践:

标签: pythondjango

解决方案


一般来说,推荐的工作流程如下:

  1. 您的 virtualenv 应该已经被排除在版本控制之外(例如使用.gitignoreor .hgignore)。如果不是,现在就这样做。
  2. 在可能的情况下,从 PyPI 将东西安装到您的 virtualenv 中,而不是从 GitHub 或其他地方下载它们。
  3. 如果您必须在 PyPI 上安装一些东西,请使用参考手册中显示的git://...一种形式传递一个类似于 pip install的 URL 。如果您需要固定到特定的提交,也可以传递给安装,并在 URL 中包含提交标识符。否则,依赖项将有效地“处于领先地位”,并且您将来可能无法回到那个确切的提交。-e
  4. 如果由于某种原因您必须维护其他人项目的本地分支(例如,因为您在其上运行 2to3?),那么按照您的建议去做可能是有意义的。克隆后安装pip install -e ./libs/libfoo(或下载,视情况而定)。不建议这样做,因为您需要定期从上游拉入或向后移植更改,这是非常耗费人力的。使用这种方法,版本控制也变得很痛苦,因为您可能没有可用于 3 路合并的上游历史记录(有一些方法可以解决这个问题- 请注意,Linus 显示的命令可能不是目前最好的方法)。
  5. 一旦你安装了所有你需要的东西,用它pip freeze来生成一个 requirements.txt 文件,把这个文本文件粘贴到你的 Django 项目目录中,然后将它检查到版本控制中。该文件应该足以完全从上游源重新生成所有依赖项,而无需将任何依赖项检查到源代码控制中(当然,除非您正在执行 #4)。
  6. 定期pip install -U对较新版本的依赖项进行回归测试并运行回归测试,然后重做pip freeze并将更改检查到版本控制中。当依赖关系破坏向后兼容性或以其他方式导致问题时,您还可以根据需要手动编辑 requirements.txt 文件。

推荐阅读