Pip 项目结构。科学巨蟒项目

Pip 项目结构。科学巨蟒项目,pip,virtualenv,setuptools,project-structure,tox,Pip,Virtualenv,Setuptools,Project Structure,Tox,我正在寻找一种更好的方法来组织我的研究项目。我有以下设置: 有项目a、b、c和库lib。每个项目处理一个不同的研究问题,库中包含跨项目使用的代码。因此,所有项目都依赖于lib。随着项目c也依赖于项目a和b,事情变得更加复杂。当我在项目c上工作时,我还将同时更新a、b或lib。每个项目都位于单独的git存储库中 到目前为止,我已经通过git子模块包含了上面的依赖项来处理这种情况,并且所有源文件都位于项目的根目录中。优点是我可以跟踪我的项目所依赖的lib版本。另外,我的一个项目可能依赖于过时版本的l

我正在寻找一种更好的方法来组织我的研究项目。我有以下设置:

有项目
a
b
c
和库
lib
。每个项目处理一个不同的研究问题,库中包含跨项目使用的代码。因此,所有项目都依赖于
lib
。随着项目
c
也依赖于项目
a
b
,事情变得更加复杂。当我在项目
c
上工作时,我还将同时更新
a
b
lib
。每个项目都位于单独的git存储库中

到目前为止,我已经通过
git子模块
包含了上面的依赖项来处理这种情况,并且所有源文件都位于项目的根目录中。优点是我可以跟踪我的项目所依赖的
lib
版本。另外,我的一个项目可能依赖于过时版本的
lib
。我从根目录运行所有内容,而不“安装”任何包到站点包等等。当路径设置不正确时,我会通过
sys.path.insert
覆盖它

但是,以下几点让我想更改布局:

  • 我一直不知道我正在编辑哪个版本的
    lib
  • 我想使用自动化测试工具(tox、jenkins等),它似乎更容易处理标准项目设置
  • sys.path.insert
    会导致难以调试的微妙问题
  • 我通常希望我的所有项目都使用
    lib
    技巧
因此,我目前正在重新安排所有项目(特别是l
lib
)以符合标准Python目录结构(源代码存储在子目录中,根目录包含
setup.py
文件),以便能够在
virtualenv
中工作。然后我可以在
requirements.txt
中列出我的所有依赖项。首先,我通过pip install-e安装
lib
as develope。然后我运行pip freeze>requirements.txt,其中包含一行类似于此的代码

-e git+<path_to_remote>@<sha>#egg=`lib`
-e git+@#egg=`lib`
因此,我再次生成了一个对特定提交(sha)的依赖项,与
git子模块
一样,确保我可以签出一个旧的提交,并且项目应该运行。我现在可以在一个
virtualenv
中安装所有东西,并且摆脱了路径问题。太好了

不过我面临一些新的麻烦。一个问题是,如何在
requirements.txt
中更新sha。我看到的最简单(但可能不是最优雅)的解决方案是编写一个
pre-commit hook
,在提交之前更新sha。有更好的办法吗


更一般地说,根据我的设置,您认为有更好的解决方案吗

据我所知,你已经基本解决了你的问题,只剩下一点点了

1) 不要使用哈希来标识库的版本。即使您没有将库发布到Cheese Shop,也要执行普通的库版本控制()并相应地标记git存储库。这样,您将在
git中拥有人类可读和可管理的版本+https://github.com/...
依赖项的URL

2) 使您的tox设置能够让您测试依赖项的稳定版本(您上次标记的)和最新repo版本的主版本