将Python置于版本控制之下是否可行?

将Python置于版本控制之下是否可行?,python,version-control,python-sphinx,Python,Version Control,Python Sphinx,如果可行,我喜欢在版本控制下构建所需的工具。理想的情况是,新的签出将在任何机器上运行,只需要安装最少的一组工具 将Python置于版本控制之下是否可行 python包怎么样?我天真地尝试在不安装Sphinx的情况下使用Sphinx,但由于依赖于Docutils而失败。有没有办法不用安装就可以使用它?没有,就像编译器一样,python解释器应该在系统范围内安装。同样的情况也适用于sphinx和docutils等工具(很可能是在通过发行版的包管理器安装sphinx时安装的) 这同样适用于大多数pyt

如果可行,我喜欢在版本控制下构建所需的工具。理想的情况是,新的签出将在任何机器上运行,只需要安装最少的一组工具

将Python置于版本控制之下是否可行


python包怎么样?我天真地尝试在不安装Sphinx的情况下使用Sphinx,但由于依赖于Docutils而失败。有没有办法不用安装就可以使用它?

没有,就像编译器一样,python解释器应该在系统范围内安装。同样的情况也适用于sphinx和docutils等工具(很可能是在通过发行版的包管理器安装sphinx时安装的)


这同样适用于大多数python软件包,尤其是那些由应用程序本身使用并通过PyPi提供的软件包。

一般来说,您的版本控制应该包含您的项目。将依赖项也包含在其中几乎总是一个坏主意,除非您已经做出明确的策略决定,始终对它们进行静态链接(对于解释代码,这涉及将它们保留在源代码树中)。听起来你想要的是,一个启动时依赖注入程序。它本质上允许您获得静态链接的好处(如果您不能/不想进入每个相关的package manager存储库,那么您的用户不需要安装依赖项),而没有缺点(您的用户最终会有多个可能不同步的通用依赖项版本),像许多应用程序一样,不要在项目签出的任何地方“就地”运行-他们需要添加到path并了解一些设置。这就是为什么他们要么是平台(Mac和Linux)的一部分,要么需要一个完整的安装程序(Windows)

考虑到这一点,最好不要将Python本身包含在存储库中——您仍然需要为平台选择正确的二进制安装程序并运行安装程序。然后,如果更新版本存储库中的版本,则必须升级目标系统。在所有这些之后,您几乎肯定不会有一致的系统——因此首先破坏了将Python用于版本控制的意义

良好的版本控制和依赖关系管理确实需要保留特定版本的工具。Setuptools包括使这一过程变得简单的工具:

easy_install "pytest==2.2.4"
请注意特定版本-如果您不太担心特定版本,则可以省略此选项,或者您可以指定最低版本:

easy_install "pytest>2.2"
(注意:还有其他类似的工具,包括pip)

默认情况下,您将从Pypi加载,这将在其存储库中为您保留所有历史版本。除非你真的担心某个特定的版本丢失,否则这没关系。如果数百万美元或生命垂危,请将该工具检查到您的本地存储库中,并使用easy_install(或类似工具)进行安装

我强烈建议使用该项目来虚拟化Python环境。这样做允许您创建一个沙箱,easy_install将在其中安装库和工具,从而将您与系统上意外安装的任何其他工具隔离开来。Virtualenv还可以管理特定版本的Python

另一种想法:如果复制特定的构建/测试目的环境是关键,那么考虑使用云/ OS虚拟化方法,如VILALBOX、VMware或类似。您可以在许多不同的机器上运行完全相同的操作系统映像。

查看并了解这些需要

virtualenv
允许您将运行项目的Python与安装该版本Python的任何其他软件包隔离开来。因此,如果您的项目需要pythonx.y,唯一的先决条件是您需要确保系统上有该版本的Python副本。在
virtualenv
中安装的任何软件包都与在其外部安装的软件包完全隔离

buildout
允许您指定包依赖关系,因此如果需要
sphinx
来构建文档,您只需将其包含在
buildout.cfg
文件中:

parts =
  sphinx

[sphinx]
recipe = collective.recipe.sphinxbuilder
当您运行
buildout
时,它将安装
collective.recipe.sphinxbuilder
,在
virtualenv
中下载并安装
docutils
sphinx
,并构建您的文档


您的
buildout.cfg
可以包含从包含
buildout.cfg
bootstrap.py
文件的文件夹的初始签出开始运行系统所需的所有依赖项。这使得为开发或最终部署设置系统变得非常容易。

不要存储软件包,存储您的软件包。