首页 > 解决方案 > 为什么 venv 在 rsync 之后会中断?

问题描述

我正在尝试为我的 Python 脚本和应用程序构建 CI/CD 流程。我能够在测试容器中构建我的 venv,但是当我将它同步到目标服务器时,Python 的版本似乎中断了。这就是我正在尝试的:

- cp -a ./. $APP_DIR
- cd $APP_DIR
- python3 -m venv venv
- source venv/bin/activate
- pip3 install -r requirements.txt
...
- rsync...

涉及的所有环境都运行 Python 3.6.8

当我在目标服务器上激活 venv 并运行时,which python3我得到/usr/bin/python3了不正确的结果。

为什么?为什么通过 rsync 部署到服务器时 venv 会中断?

我是 Python 开发和虚拟环境过程的新手。venv 是否应该只在它们需要运行的服务器(或容器)上创建?有时我的目标服务器上没有安装 python3-venv。是否可以使用代码部署 venv 并使用它来运行我的脚本?

标签: pythonpython-3.xcontinuous-integrationrsyncpython-venv

解决方案


在我看来,最好的办法是venv从 rsync 中排除文件夹

rsync --exclude 'venv'  source/ destination/

requirements.txt文件是您在任何地方都满足您的依赖项的最佳朋友。

python3-venv如果您对提供的 Python 版本感到满意,我还建议您从 Linux 发行版安装软件包。否则完全安装另一个 Python 版本(您可以在 Internet 上找到如何为您的发行版安装不同的 Python)。

举例:

主机 1(这是你开发的地方,你可以在你的 venv 中添加一些东西)

cd /tmp/
mkdir app_base # base folder for venv/ and app_code/
cd app_base/
mkdir app_code # base folder for code only

# LOCAL virtual environment creation and activatin
python3 -m venv venv
source venv/bin/activate

# Just an example of whatever you may need
pip install numpy
# Let's say that it could be enough for your app to work.

# Create requirements.txt
pip3 freeze >requirements.txt

服务器,容器,任何远程..

SETUP 这应该运行一次(或至少rsync 之前)。与上述代码段的前 5 行相同。

cd /tmp/
mkdir app_base
cd app_base/
mkdir app_code
python3 -m venv venv

现在您已经在远程主机上完成了设置,让我们回到您开发的主机 1。您需要同步您的app_coderequirements.txt(可能还有其他一些东西),但不是venv文件夹

主机 1

您可以将其包装在 cron 作业中

rsync -xav -e ssh --exclude 'venv' /tmp/app_base/ user@X.X.X.X:/tmp/app_base/

然后,最后,您可以让您的服务器虚拟环境满足您的需求,直接在服务器上运行它。

服务器,容器,任何远程..

cd /tmp/app_base
source venv/bin/activate
pip3 install -r requirements.txt

现在,在远程主机上,您应该能够运行(单元测试)您的代码。

对粗体问题的“严格”回答

为什么?为什么通过 rsync 部署到服务器时 venv 会中断?

是:出于性能原因,一些 Python 包(例如我在示例中使用的 numpy)提供了二进制例程。复制虚拟环境文件夹仅适用于相同的 Linux 发行版或 Windows 版本,具有相同的架构和 Python 版本。这不是创建虚拟环境的目的。


推荐阅读