[英]Why does VSCode not detect venv if the venv folder is installed inside a subdirectory?
[英]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_code
和requirements.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.