2013-03-27 58 views
0

我有这样的目录结构:我可以使用requirements.txt文件来处理本地python目录吗?

src/ 
--scripts/ 
----foo/a.py 
----bar/b.py 
--lib1 
--lib2 
--lib3 

的目的,如果有脚本/富/和脚本/酒吧/可运的Python脚本,利用模块在LIB1的目录,LIB2, LIB3。在活动开发中,脚本lib1,lib2和lib3都是独立的内部git存储库。没有一个静态接口或发布版本依赖。基本上,他们几乎在同一时间由一个小团队编写。

我玩过lib [1-3]子模块,我真的很讨厌这个工作流程。我想我想要的是能够从foo/a.py中执行“import lib1”,并让它使用lib1中的当前代码。一旦成熟,我们可能会对所有东西进行版本化,并致力于生产适当的包。

这样做的一种方法是在每个脚本中使用sys.path以明确查看'../../'或其他内容。我想知道是否有更优雅的东西。我可以得到像pip install -r requirements.txt这样的工作吗?我不想做一个官方的pypi setup.py,我只想得到一个指向lib [1-3]目录的当前内容的指针。我喜欢requirements.txt方法的原因是,随着库的成熟,我最终会将版本和git URL放在那里。

或者,有没有完全不同的方式来做到这一点?

回答

2

从常规意义上的确实一个Git仓库安装模块需要setup.py,但它可以是一个最低限度的一个,而不是更全面的一个像你的PyPI将模块使用。例如:

#!/usr/bin/env python 

from distutils.core import setup 

setup(
    name="foo", 
) 

如果你把类似的东西,您的每一个LIB库,那么你可以让你的需求文件点用-e git://git.example.com/foo.git#egg=foo git的回购协议。如果你将它安装到virtualenv中,那么它将出现在virtualenv目录中的src/foo,并且当从该virtualenv运行Python时它将自动添加到sys.path

-e选项也接受本地目录作为参数,因此,如果你能保证的是,当前的工作目录将永远是你的项目的根当你从requirements.txt安装(这样的相对路径解析正确),它应该工作只要在那里写入-e lib1这样的东西,然后你仍然可以引用库作为git子模块,如果你想。

如果你有决心创建setup.py那么你的任务是运行python setup.py develop时仿效会发生什么。这条命令做了两件事(像Python 2.7的,至少):

  • 它创建在你的virtualenv的site-packages lib目录的egg link(或系统范围内的,如果你没有的virtualenv)指向您的目标源目录。
  • 它添加一行到easy-install.pth,该行也在site-packages目录中,该目录也指向您的目标源目录。

你可以选择通过比运行setup.py editable其他手段,以做到既上述行动,并得到为Python的当前版本相同的效果,当然,编辑发行的实现可以在Python的新版本改变。

+0

如果我没有使用virtualenv,它将在哪里安装? – kbyrd 2013-03-29 18:25:04

+0

如果你从git repo安装,按照我的经验'pip'会在当前工作目录下创建一个'src'目录。我不确定这是故意的还是只是由于未设置'VIRTUAL_ENV'环境变量而导致的错误。如果你从一个本地目录安装,那么它只会尝试将egg链接和'pth'文件写入系统范围的'site-packages'目录,其绝对路径指向你指定的本地目录。 – 2013-03-29 18:44:55

相关问题