是否可以跨机器共享 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 也不是一个好主意。相反,我会给你两个替代工作流程来解决你的问题:
- 如果您想在多台计算机之间共享一个独立的工作区,请使用docker。使用容器是您所提到的完美解决方案 (https://runnable.com/docker/python/dockerize-your-python-application)
- 否则,如果您只需要共享项目之间的依赖关系,您可以使用
requirements.txt
。在这种情况下,基本驱动器将不包含库,但是一旦复制了代码,您应该能够使用 pip
. 安装它们
我们在制作 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 也不是一个好主意。相反,我会给你两个替代工作流程来解决你的问题:
- 如果您想在多台计算机之间共享一个独立的工作区,请使用docker。使用容器是您所提到的完美解决方案 (https://runnable.com/docker/python/dockerize-your-python-application)
- 否则,如果您只需要共享项目之间的依赖关系,您可以使用
requirements.txt
。在这种情况下,基本驱动器将不包含库,但是一旦复制了代码,您应该能够使用pip
. 安装它们