繁体   English   中英

为什么在rsync之后venv会中断?

[英]Why does venv break after 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并使用它来运行我的脚本?

通过venv创建环境时,它会将环境路径的绝对路径存储到bin/activate 另外,在指向现有python安装的新环境中创建了一些符号链接。

由于这种环境的结果是只对主机有效路径venv被处决。 这也在文档中说明(省略了一些部分):

运行此命令会创建目标目录[...],并在其中放置一个pyvenv.cfg文件,其中一个主键指向运行该命令的Python 安装 它还创建了一个bin [...]子目录,其中包含Python二进制文件/二进制文件的副本/符号链接( 适用于在环境创建时使用的平台或参数 )。

您可以通过以下命令轻松检查此事实:

mkdir /tmp/example_dir_for_stackoverflow
cd /tmp/example_dir_for_stackoverflow
python3 -m venv venv
grep stackoverflow venv/bin/activate

它将输出:

VIRTUAL_ENV="/tmp/example_dir_for_stackoverflow/venv"

如果您将此环境rsync到另一个系统到另一个路径和/或不同的python安装, bin/activate的设置不匹配,它不起作用。

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

rsync --exclude 'venv'  source/ destination/

requirements.txt文件是您最好的朋友,可以让您的依赖项满意。

如果您对提供的Python版本感到满意,我还建议您从Linux发行版安装python3-venv软件包。 否则安装另一个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。 您需要rsync您的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版本。 并不是为虚拟环境创建的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM