是否可以跨机器共享 virtualenv?

Is is possible to share a virtualenv across machines?

我们在制作 python 代码时遇到问题,该代码由网络驱动器上托管的进程使用,运行 在多台计算机上。我认为 virtualenv 是解决这个问题的好方法,但共享安装的额外复杂性使这成为一个挑战。

设置:

Machine H:
  - hosts network drive D
  - doesn't execute anything
Machine A:
  - has python installed
  - has created the virtualenv on D
Machine B:
  - may have python installed, but no additional packages

驱动器 D:

project/
  |- SomeProcess.kjb
  |- venv/
    |- Scripts/
      |- activate.bat
    |- [...]
  |- python_package/
    |- entry_point.py
    |- [...]

在驱动器 D 上,我们安装了一个由不同机器执行的进程,作为执行的一部分,调用一些 python 代码。具体来说,这是一项 Kettle 工作,但我认为这并不重要。关键是在这个过程中它通过 运行ning

调用了 python 代码
/D/project/venv/Scripts/activate.bat
python /D/project/python_package/entry_point.py

在类似 shell 的环境中。作业本身是由必须在调用机器上安装和执行的程序 运行 完成的。这有效 IFF 调用机器也是在驱动器上创建 virtualenv 的机器。如果另一台机器尝试 运行 该过程,它将停止并出现与未使用正确 python 安装相关的错误,例如:

Traceback (most recent call last):
  File "D:\project\venv\lib\site.py", line 761, in <module>
    main()
  File "D:\project\venv\lib\site.py", line 738, in main
    paths_in_sys = addsitepackages(paths_in_sys)
  File "D:\project\venv\lib\site.py", line 271, in addsitepackages
    addsitedir(sitedir, known_paths)
  File "D:\project\venv\lib\site.py", line 202, in addsitedir
    addpackage(sitedir, name, known_paths)
  File "D:\project\venv\lib\site.py", line 170, in addpackage
    exec(line)
  File "<string>", line 1, in <module>
  File "D:\project\venv\lib\importlib\util.py", line 14, in <module>
    from contextlib import contextmanager
ModuleNotFoundError: No module named 'contextlib'

不使用 virtualenv 的替代方案不可取,因为它要求调用机器全局安装所需的 python 包。

一个可能的修复方法是为每台调用机器安装一个 virtualenv,并在进程执行时切换到正确的机器。然而,我们目前不知道如何让进程识别调用机器和 select 正确的 virtualenv。

这个问题可以用virtualenvs解决吗?也许我们应该寻找没有这个问题的替代工作流程。

首先要考虑的是:应该有 一个非常非常好的理由 将代码存储在没有 VCS 的共享驱动器中。如果没有,您可以开始使用 GIT.

即使你有充分的理由:共享 virtualenvs 也不是一个好主意。相反,我会给你两个替代工作流程来解决你的问题:

  1. 如果您想在多台计算机之间共享一个独立的工作区,请使用docker。使用容器是您所提到的完美解决方案 (https://runnable.com/docker/python/dockerize-your-python-application)
  2. 否则,如果您只需要共享项目之间的依赖关系,您可以使用 requirements.txt。在这种情况下,基本驱动器将不包含库,但是一旦复制了代码,您应该能够使用 pip.
  3. 安装它们