Python:在哪里放置外部软件包?

时间:2018-09-04 22:22:01

标签: python django

我有一个Django项目,该项目使用的外部软件包尚未在我的virtualenv中通过pip安装,而是通过git clone获得,现在我想知道将其放置在哪里,以及文件夹名称应如何。外部软件包是这样的:Working example in rextester.

这是我当前的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

我已将此软件包evernote-sdk-python3放在Django项目文件夹中名为libs的文件夹中。我还将实用程序功能放在utils下的名为libs的程序包中

现在我知道关于如何像下面两个这样的项目结构有很多建议:

[1] Evernote Python3 SDK

[2] Structuring Your Project — The Hitchhiker's Guide to Python

我也知道Python不会强迫您使用教条式文件夹结构。但是,尽管如此:我对包装,包装命名和包装结构没有深刻的了解。

  1. 将外部软件包放在(Django)项目根文件夹下是否是一个好习惯?

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


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

  • src
  • lib
  • utils

1 个答案:

答案 0 :(得分:4)

通常,推荐的工作流程如下:

  1. 您的virtualenv应该已经从版本控制中排除(例如,使用.gitignore.hgignore)。如果不是,请立即这样做。
  2. 尽可能将内容从PyPI安装到您的virtualenv中,而不是从GitHub或其他地方下载它们。
  3. 如果必须在PyPI上安装某些东西,请使用shown in the reference manual格式之一将git://...这样的URL传递给pip安装。如果您需要固定到特定的提交,请也传递-e进行安装,并在URL中包括一个提交标识符。否则,依赖项将有效地“活跃”起来,并且您将来可能无法重新获得确切的提交。
  4. 如果出于某种原因您必须维护其他人项目的本地分支(例如,因为您正在该项目上运行2to3?),那么按照您的建议进行操作可能很有意义。克隆(或下载(视情况而定))后,使用pip install -e ./libs/libfoo安装。不建议这样做,因为您需要定期从上游拉入或向后移植更改,这非常耗费人力。使用这种方法的版本控制也很麻烦,因为您可能没有可用于三路合并的上游历史记录(有ways around this-请注意,Linus显示的命令可能不是当今最好的方法)。 / li>
  5. 安装完所需的所有文件后,请使用pip freeze生成requirements.txt文件,将所述文本文件粘贴到Django项目目录中,然后将其检入版本控制中。此文件应该足以从上游源完全重新生成所有依赖项,而无需将任何依赖项检入源代码控制中(当然,除非您执行的是#4)。
  6. 定期执行pip install -U并针对较新版本的依赖项运行回归测试,然后重做pip freeze并将更改检查到版本控制中。当依赖项破坏向后兼容性或导致其他问题时,您还可以根据需要手动编辑requirements.txt文件。