#工作记录
一、前言
嵌套虚拟环境本来是不建议的一种方法,这种嵌套虚拟环境的使用有一定特殊性,但在一些特别的使用场景下,嵌套虚拟环境的使用非常有用。
二、嵌套虚拟环境:
(一)conda嵌套virtualenv

该嵌套环境本质上是操作conda的base环境。如果需要这种嵌套,请切换到其他环境进行操作。
(一)virtualenv嵌套conda

该嵌套环境本质上是操作.venv本地虚拟环境。
(三)其他
其他嵌套环境暂不在此记录
(四)注意:
以下记录所属平台为Windows11 X64位系统,intel处理器,NVIDIA显卡,DDR5内存。
不同平台可能嵌套虚拟环境的实现机制不一样,实现嵌套的软件也会不一样。但原理可供参考。
三、使用举例
(一)conda嵌套virtualenv
conda嵌套virtualenv比较容易实现,需要用经过conda初始化的powershell终端导航到项目本地目录,该本地目录需要有一个virtualenv虚拟环境(.venv)。
用powershell激活相关conda虚拟环境后,再激活本地virtualenv虚拟环境(.venv)就能实现
为您的终端初始化 conda:
conda init --all
#激活conda虚拟环境
conda activate 环境名
#激活virtualenv虚拟环境(.venv)
.venv\Scripts\activate

(二)virtualenv嵌套conda
virtualenv嵌套conda比较不好实现,需要用未经过conda初始化的powershell终端(最好使用powershell预览版,它支持更多更新的功能)导航到项目本地目录,该本地目录需要有一个virtualenv虚拟环境(.venv),先激活.venv虚拟环境 ,然后再激活conda虚拟环境(不事先激活)。
#激活virtualenv虚拟环境(.venv)
.venv\Scripts\activate
#激活conda虚拟环境
conda activate 环境名
用powershell(预览版)激活本地virtualenv虚拟环境(.venv)后,再激活相关conda虚拟环境就能实现。

四、使用案例:
在GitHub上,有些开源项目指定要求使用conda虚拟环境 或者 指定virtualenv虚拟环境,有些时候出于种种原因,我们会不想按项目网页指导的流程进行部署,而少数开源项目在不修改代码的情况下,无法实现非官方指定的虚拟环境进行部署,像这种情况下就需要了解嵌套虚拟环境。
拿一个开源项目举例:
facefusion
一个道德合规的换脸开源项目,这个例子比较经典,可以用来说明virtualenv嵌套conda的实践:
该项目在官方的安装指导文档中,建议使用conda虚拟环境,python==3.12

但我只想用本地 .venv虚拟环境部署,可是部署时总是失败,提示conda环境未激活。如果我们不想修改代码就实现.venv虚拟环境部署,就需要用到virtualenv嵌套conda虚拟环境来绕过安装检测。

因此就有了使用嵌套虚拟环境部署的方法:
**思路:**我要实现.venv虚拟环境的部署,并且软件包全部安装到.venv虚拟环境,但又要绕过项目代码的conda安装环境检测。
1、用PyCharm在项目本地创建一个.venv虚拟环境:




关于.venv虚拟环境的创建,请参考:
2、然后进入终端先激活该环境,

3、然后再激活一个相同python版本的conda虚拟环境

上图可以看到已经进入virtualenv嵌套conda的虚拟环境
这里我新建了一个名为"facefusion"的同名conda虚拟环境,同样使用的python3.12版本。这里是为了演示用.venv绕过conda环境检测从而部署facefusion的方法,并不是为了多此一举而多此一举!
(本来是不同python版本的conda环境也行,只要是conda环境就行,但为了避免出现莫名错误,建议先在anaconda创建一个纯净的、与.venv虚拟环境中python版本相同的虚拟环境,部署完成后再删除该conda虚拟环境)
4、然后运行facefusion项目的安装脚本:
python install.py --onnxruntime cuda

可以看到安装脚本已经在正确运行了,没有了之前.venv环境运行脚本时的错误提示。

可以看到安装脚本已经成功完成安装。
然后我们可以按提示升级一下venv环境中的pip(一般建议创建完环境后就先升级一下):
python.exe -m pip install --upgrade pip

5、然后就可以用命令启动 facefusion了
python facefusion.py run --open-browser

因为首次启动需要下载一些模型文件,而这些文件的下载要看网络状况而定,这里就不做等待了.
6、删除Anaconda中用于配合部署测试的conda虚拟环境
后续可以删除Anaconda中用于配合部署测试的facefusion虚拟环境了,只保留项目本地的.venv环境供项目使用就可以了。
小结
至此,用virtualenv嵌套conda虚拟环境部署facefusion项目就算完成了。
写在最后
conda嵌套virtualenv和virtualenv嵌套conda需要灵活使用,一般conda嵌套virtualenv不常用,而virtualenv嵌套conda则可以在特殊场景下发挥作用。