项目结构。科学Python项目

时间:2014-09-05 20:06:51

标签: pip virtualenv setuptools project-structure tox

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

有项目abc和图书馆lib。每个项目都处理一个不同的研究问题,库中包含跨项目使用的代码。因此,所有项目都依赖于lib。由于项目c依赖于项目ab,因此事情变得更加复杂。当我处理项目c时,我还会同时更新ablib。每个项目都在一个单独的git存储库中。

到目前为止,我已经通过git submodule包含上面的依赖关系来处理这种情况,并且所有源文件都位于项目的根目录中。优点是我可以跟踪我的项目所依赖的lib版本。我的一个项目也可能依赖于lib的过时版本。我从根目录运行所有内容而没有"安装"任何包到site-packages左右的包。如果路径设置不正确,我会通过sys.path.insert覆盖它。

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

  • 我一直在跟踪我正在编辑的lib版本。
  • 我想使用自动化测试工具(tox,jenkins等),这些工具似乎更容易处理标准项目设置。
  • sys.path.insert会导致难以调试的细微问题。
  • 我通常希望我的所有项目都使用lib的提示。

因此我正在重新安排所有项目(特别是lib)以符合标准的Python目录结构(存储在子目录中的源,root包含setup.py文件)以便能够工作在virtualenv中。然后我可以列出requirements.txt中的所有依赖项。首先我通过pip install -e安装lib。然后我运行pip freeze> requirements.txt然后包含类似于此的行。

-e git+<path_to_remote>@<sha>#egg=`lib`

所以我再次使用git submodule生成了对特定提交(sha)的依赖,确保我可以签出旧提交并且项目应该运行。我现在可以在virtualenv中安装所有内容并摆脱我的路径问题。大。

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

更一般地说 - 根据我的设置,您是否看到了更好的解决方案?

1 个答案:

答案 0 :(得分:0)

据我所知,你已经解决了大部分问题,而且只剩下一小部分了。

1)不要使用哈希来识别库的版本。即使您没有将您的库发布到Cheese Shop,也要进行正常的库版本控制(semver)并相应地标记git存储库。这样你就可以在git+https://github.com/...依赖关系的URL中拥有人类可读且易于管理的版本。

2)以允许您从最新的repo版本测试稳定版本的依赖项(您上次标记的)和主版本的方式进行tox设置。