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

时间:2012-06-21 08:35:33

标签: python version-control python-sphinx

在可行的情况下,我喜欢在版本控制下拥有构建所需的工具。理想的情况是,在任何需要首先安装最少工具的机器上运行新的结账。

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

python包怎么样?由于对Docutils的依赖,我在没有安装它的情况下尝试使用Sphinx失败了。有没有办法在不安装的情况下使用它?

5 个答案:

答案 0 :(得分:5)

请注意virtualenvbuildout了解这些需求。

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

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

parts =
  sphinx

[sphinx]
recipe = collective.recipe.sphinxbuilder

当您运行buildout时,它将安装collective.recipe.sphinxbuilder,在docutils内下载并安装sphinxvirtualenv,并构建您的文档。

您的buildout.cfg可以包含从初始签出包含buildout.cfgbootstrap.py文件的文件夹开始运行所需的所有依赖项。它使得开发或最终部署系统变得非常简单。

答案 1 :(得分:4)

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

这同样适用于大多数python包,特别是那些由应用程序本身使用并可通过PyPi获得的包。

答案 2 :(得分:2)

与许多应用程序一样,Python不会在项目签出的任何地方“就地”运行 - 他们需要添加到路径并了解设置。这就是为什么他们要么是平台的一部分(Mac和Linux),要么需要一个成熟的安装程序(Windows)。

考虑到这一点,最好不要将Python本身包含在存储库中 - 您仍然需要为平台选择合适的二进制安装程序并运行安装程序。然后,如果更新版本存储库中的版本,则必须升级目标系统。毕竟,你几乎肯定没有一致的系统 - 所以首先要破坏Python在版本控制中的作用。

良好的版本控制和依赖关系管理确实需要保留特定版本的工具。 Setuptools包含easy_install,这使这很容易:

easy_install "pytest==2.2.4"

请注意具体版本 - 如果您对特定版本不太担心,可以省略,或者您可以指定最低版本:

easy_install "pytest>2.2"

(注意:还有其他类似的工具,包括pip)

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

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

另一个想法:如果为了构建/测试目的而复制特定环境是重点,那么请考虑使用云/ OS虚拟化方法,如VirtualBox,VMWare或类似方法。您可以在许多不同的计算机上运行完全相同的操作系统映像。

答案 3 :(得分:1)

通常,您的版本控制应包含您的项目。除非你已经做出明确的策略决定总是静态链接(对于解释代码涉及将它们保存在源代码树中),否则在那里包含依赖项几乎总是一个坏主意。听起来你想要的是Zero install,一个启动时依赖注入器。它本质上允许您获得静态链接的好处(如果您不想/不想进入每个相关的包管理器存储库,您的用户不需要安装您的依赖项)没有缺点(您的用户最终得到多个,可能不同步的常见依赖版本。)

答案 4 :(得分:0)

是的!

当你想向你的非技术用户交付工具而不要求他们安装任何东西时,你可以将 python 放入 scm。理论上,您可以设置一些其他工具并让他们全部安装它,这样您就可以确保每次同步时它们都运行 pip install -r requirements.txt 并获取所有依赖项,但这并不总是那么容易。如果你在使用 python 时遇到阻力(“它没有编译;每个人都必须安装 python”),那么将 python 放在 scm 中是你的选择!

如果您使用的是 Linux/Unix,您可能会使用内置的包管理器,所以我假设您使用的是 Windows。 (注意:有适用于 Windows 的包管理器,例如 scoop、choco 和 winget——它们值得一看。)

您有两种将 python 放入 scm 的选项:

Windows embeddable package (64-bit)

why so many python installers 上阅读有关此软件包的更多信息。

如果你想要最小的python并手动提供包(不使用pip), 这应该是一个好方法。理论上,you can set yourself up to install packages 也。但是,如果您希望团队中的任何开发人员能够安装软件包, 这可能不是一个好的选择。

Windows installer (64-bit)

常规的python安装。但我们会做一些不同的事情。

  1. 设置您的 scm 忽略 *.pyc__pycache__
  2. 将 python 安装到 C:\python3
  3. 我很小心地不运行 python 以避免生成任何临时文件,以便它们更容易被捕获和忽略。
  4. C:\python3 复制到您的项目中:c:\proj\tools\python3
  5. C:\python3 卸载 python
    • 这样您的机器就像您的用户一样。您可以将项目中的 python 添加到 PATH 中,或者在确认一切正常后重新安装 python。
  6. 创建一个目录来保存您的 Python 模块:c:\proj\tools\pymodules
  7. 在该文件夹中创建一个空的 __init__.py 文件:c:\proj\tools\pymodules\__init__.py
  8. 创建一个带有相对路径的 work.pth 文件,以便 python 可以找到您的 python 模块:c:\proj\tools\python3\site-packages\work.pth
    ../../../pymodules
  1. 现在提交所有内容。
  2. 运行 python -m http.server 8000 --directory . 或其他一些 Python 代码,以便您可以仔细检查您的忽略是否正确。

现在您将能够使用 pip 安装新包并将它们提交到源代码控制。如果您创建 pymodules\work\__init__.py(空)和 pymodules\work\example.py

print('Hello from example.py')

你可以运行它:

c:\proj\tools\python3\python.exe -m work.example

并导入它:

import work.example

不要弄乱路径!

但是,您可能需要确保您的所有用户直接运行 python.exe,并且不能假设它在他们的 PATH 中。但既然你知道它在他们的项目中的位置,那不太可能成为问题。您可以创建一键批处理文件,从它们的路径确定 python 的路径:

%~dp0\..\..\python3\python.exe -m work.example

我们多年来一直在工作中使用类似的设置,最近我在一个新项目中按照上述步骤进行了设置。我们在 svn 中有我们的项目,它运行得很好,但是将这么多文件转储到 git 中可能不太理想。