4

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

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

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

4

5 回答 5

5

查看virtualenvbuildout以满足这些需求。

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

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

parts =
  sphinx

[sphinx]
recipe = collective.recipe.sphinxbuilder

当你运行buildout它时,它将安装collective.recipe.sphinxbuilder、下载和安装docutils,并sphinx在其中virtualenv构建你的文档。

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

于 2012-06-21T09:02:13.817 回答
4

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

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

于 2012-06-21T08:38:31.427 回答
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。

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

于 2012-06-21T09:01:10.817 回答
1

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

于 2012-06-21T08:48:43.837 回答
0

是的!

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

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

将 python 放入 scm 有两种选择:

Windows 可嵌入包(64 位)

阅读有关此软件包的更多信息,了解为什么有这么多 python 安装程序

如果您想要最小的 python 并手动提供包(不使用 pip),这应该是一个好方法。从理论上讲,您也可以设置自己安装软件包 。但是,如果您希望团队中的任何开发人员都能够安装软件包,这可能不是一个好的选择。

Windows 安装程序(64 位)

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

  1. 设置你的 scm 忽略*.pyc__pycache__
  2. 安装python到C:\python3
  3. 我小心不要运行 python 以避免生成任何临时文件,这样它们就更容易被捕获和忽略。
  4. 复制C:\python3到您的项目中:c:\proj\tools\python3
  5. 卸载pythonC:\python3
    • 这样你的机器就像你的用户一样。一旦确认一切正常,您可以将项目中的 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 中可能不太理想。

于 2021-07-31T02:22:22.620 回答