ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ubuntu Python虚拟环境搭建指南:venv、conda与项目实战

Ubuntu Python虚拟环境搭建指南:venv、conda与项目实战 1. 为什么我们需要虚拟环境如果你在Ubuntu上折腾过Python项目大概率遇到过这样的场景项目A需要Django 3.2项目B需要Django 4.0而系统全局安装的Python包只有一个位置。当你为了项目B升级了Django回头再跑项目A时很可能因为版本不兼容而报错这就是所谓的“依赖地狱”。虚拟环境就是为了解决这个问题而生的它本质上是一个独立的目录里面包含了特定版本的Python解释器、pip包管理工具以及一套独立的第三方库。在这个“沙盒”里你可以为每个项目安装特定版本的依赖而不会污染系统全局环境也不会被其他项目的依赖所干扰。对于Ubuntu用户尤其是进行Web开发、数据科学或机器学习的朋友熟练使用虚拟环境是保证项目稳定、可复现的第一步。2. 在Ubuntu上搭建虚拟环境的几种主流方式在Ubuntu上创建Python虚拟环境主要有三种工具venv、virtualenv和conda。它们各有侧重选择哪个取决于你的具体需求。2.1 内置轻量级选手venvvenv是Python 3.3及以上版本自带的模块无需额外安装。它足够轻量功能纯粹就是用来创建隔离的Python环境。如果你的项目是纯Python的不涉及复杂的科学计算包或者你希望环境尽可能干净、启动快venv是首选。核心优势开箱即用Python 3自带无需安装。轻量快速创建和激活环境速度极快。纯粹专注于Python包隔离。潜在局限只管理Python包不管理Python解释器本身你需要先安装好特定版本的Python。对于需要非Python依赖如某些C库的复杂科学包配置可能稍显繁琐。2.2 经典灵活派virtualenvvirtualenv是一个第三方工具在venv出现之前是事实上的标准。它比venv更早功能也更强大一些比如可以更灵活地指定Python解释器的路径对旧版Python 2的支持也更好虽然Python 2已停止维护但一些遗留项目可能仍需它。核心优势兼容性好支持更广泛的Python版本包括Python 2。功能灵活提供更多高级选项如--always-copy总是复制文件而非链接等。社区成熟有大量历史项目和教程使用它。选择建议除非你有明确需要使用Python 2或virtualenv特有功能的需求否则对于Python 3项目直接使用venv更为简单直接。2.3 全能科学计算平台conda (Anaconda/Miniconda)conda不仅仅是一个虚拟环境管理器它还是一个跨平台的包管理和环境管理系统。它最大的特点是不仅能管理Python包还能管理Python解释器本身以及各种非Python的二进制依赖库比如MKL数学库、CUDA工具包等。这对于数据科学、机器学习领域尤其友好因为像numpy,pandas,tensorflow这类包的安装往往伴随着复杂的系统级依赖。核心优势管理Python解释器可以在同一台机器上轻松安装和管理多个版本的Python。管理非Python依赖解决科学计算包的系统级依赖问题避免“编译地狱”。预编译二进制包通过conda-forge等渠道提供大量预编译好的包安装速度快且成功率高。潜在局限体积较大Anaconda发行版包含大量预装科学包体积庞大。Miniconda是更轻量的选择。包版本可能略旧相比PyPI某些包在conda渠道的更新可能稍慢。环境隔离逻辑不同其环境管理与venv/virtualenv原理不同混用时需注意。如何选择通用Python Web开发、脚本编写使用venv。数据科学、机器学习、深度学习使用conda(推荐Miniconda)。需要维护Python 2老项目可以考虑virtualenv。接下来我将以最通用的venv和最全能的conda为例详细演示从创建环境、安装依赖到运行项目的完整流程。3. 使用 venv 创建并管理项目环境通用Python开发假设我们有一个名为my_django_project的Django项目我们将为其创建一个专属的虚拟环境。3.1 环境创建与激活首先确保你的Ubuntu系统已安装Python 3和pip。Ubuntu 22.04 LTS默认已安装Python 3.10。# 1. 更新包列表并确保python3-pip已安装 sudo apt update sudo apt install python3-pip -y # 2. 为项目创建一个目录并进入 mkdir -p ~/projects/my_django_project cd ~/projects/my_django_project # 3. 使用python3 -m venv创建虚拟环境环境目录命名为venv这是一种常见约定 python3 -m venv venv执行后当前目录下会生成一个名为venv的文件夹里面包含了独立的Python环境。关键一步激活环境。激活意味着当前终端会话将使用这个虚拟环境内的Python和pip。source venv/bin/activate激活成功后你的命令行提示符通常会发生变化前面会显示环境名(venv)如下所示(venv) userhost:~/projects/my_django_project$现在所有python和pip命令都指向虚拟环境内部与系统全局环境无关。你可以用which python命令来验证。3.2 在虚拟环境中安装项目依赖项目依赖通常记录在一个名为requirements.txt的文件中。我们先创建一个示例文件。# 在项目根目录创建requirements.txt并写入一些示例依赖 cat requirements.txt EOF Django4.2.11 djangorestframework3.15.1 psycopg2-binary2.9.9 python-dotenv1.0.0 EOF然后使用虚拟环境中的pip进行安装# 确保已激活环境 (venv) pip install -r requirements.txtpip会自动从PyPI下载并安装指定版本的所有包及其依赖。安装完成后可以使用pip list查看当前环境中已安装的包。注意永远不要在激活的虚拟环境外运行pip install package除非你确实想安装到系统全局。一个常见的错误是在终端关闭再重新打开后忘记了重新激活环境导致包被错误地安装到全局。3.3 运行你的项目假设我们的Django项目已经存在或者通过django-admin startproject创建运行它# 1. 创建Django项目如果尚未创建 # django-admin startproject myproject . # 2. 进入项目设置目录根据你的实际项目结构调整 # cd myproject # 3. 运行开发服务器 python manage.py runserver此时Django开发服务器会启动通常监听在http://127.0.0.1:8000。在浏览器中访问该地址就能看到项目运行了。3.4 环境的退出与复用退出虚拟环境当你完成工作只需在终端输入deactivate提示符前的(venv)会消失环境被停用。再次进入项目工作下次打开终端只需进入项目目录再次执行source venv/bin/activate即可。分享环境你可以通过pip freeze requirements.txt生成当前环境所有包的精确版本列表。其他人拿到你的项目代码和这个文件按照上述步骤创建环境并安装就能得到一个完全一致的环境。删除环境如果环境损坏或不再需要直接删除venv文件夹即可rm -rf venv。系统环境完全不受影响。4. 使用 conda 创建并管理科学计算环境对于数据科学项目我们使用conda。这里以安装Miniconda为例。4.1 Miniconda的安装与初始化首先从清华大学开源软件镜像站下载Miniconda安装脚本速度更快。# 下载适用于Linux的64位Miniconda3安装脚本以Python 3.10版为例 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_23.11.0-1-Linux-x86_64.sh # 运行安装脚本 bash Miniconda3-py310_23.11.0-1-Linux-x86_64.sh安装过程中按照提示阅读许可协议按q退出阅读输入yes同意选择安装路径默认~/miniconda3即可最后在询问“Do you wish the installer to initialize Miniconda3?”时强烈建议输入yes。这会将conda初始化脚本添加到你的~/.bashrc中这样每次打开终端conda基础环境就会自动激活你会看到提示符前有(base)。安装完成后关闭并重新打开终端或者执行source ~/.bashrc使配置生效。你应该能看到(base)提示符。踩坑提示如果你在WSL2中安装conda有时初始化可能会失败导致conda命令找不到。如果遇到可以手动初始化~/miniconda3/bin/conda init bash然后重启终端。4.2 创建并激活conda虚拟环境conda的环境管理与venv逻辑类似但命令不同。我们创建一个名为ds_env、Python版本为3.9的环境。# 创建环境指定Python版本 conda create -n ds_env python3.9 # 激活环境 conda activate ds_env激活后提示符会从(base)变为(ds_env)。这个环境与base环境以及其他conda环境都是隔离的。4.3 在conda环境中安装包conda安装包有两种主要渠道默认的anaconda频道和社区维护的conda-forge频道通常包更新更快、更全。建议优先使用conda-forge。# 从conda-forge频道安装包 conda install -c conda-forge numpy pandas matplotlib scikit-learn jupyter # 你也可以同时指定多个频道conda-forge优先级更高 conda config --add channels conda-forge conda config --set channel_priority strict # 之后安装就可以省略-c conda-forge conda install numpy对于某些仅在PyPI上有的包在conda环境里同样可以使用pip安装。但有一个重要原则尽量使用conda安装尽可能多的包对于conda没有的包再用pip补充。这可以最大程度避免依赖冲突。4.4 运行Jupyter Notebook并安装内核在ds_env环境中安装了jupyter后如果你想在Jupyter Notebook中使用这个环境需要将其注册为一个内核。# 确保在ds_env环境中 conda activate ds_env # 安装ipykernel conda install ipykernel # 将当前环境添加到Jupyter内核列表并设置显示名称 python -m ipykernel install --user --name ds_env --display-name Python (Data Science)然后启动Jupyter Notebookjupyter notebook浏览器打开后在新建笔记本时就可以选择“Python (Data Science)”内核了这样notebook就会运行在ds_env这个包含所有科学计算包的环境中。4.5 conda环境的导出、删除与常见问题导出环境conda env export environment.yml。这个YAML文件包含了环境名、Python版本、所有conda安装的包及其精确版本甚至包括构建号复现性极强。从YAML文件创建环境conda env create -f environment.yml。删除环境conda remove -n ds_env --all。列出所有环境conda env list。常见问题处理创建环境时提示“The channel is not accessible”这通常是网络问题或频道地址有误。可以尝试更换国内镜像源如清华、中科大源使用conda config --show-sources查看当前配置并用conda config --remove-key channel_priority临时取消严格优先级试试。conda和pip混用导致环境混乱如果出现冲突最干净的方法是重建环境。遵循“conda优先pip补充”的原则并尽量在创建环境时conda create就指定所有能通过conda安装的核心包。5. 从GitHub克隆并运行一个真实项目让我们以一个典型的Python项目为例演示从零开始搭建环境的完整工作流。假设项目地址是https://github.com/exampleuser/flask-example-app.git# 1. 克隆项目代码 cd ~/projects git clone https://github.com/exampleuser/flask-example-app.git cd flask-example-app # 2. 查看项目结构通常README.md或requirements.txt在根目录 ls -la # 3. 创建虚拟环境使用venv python3 -m venv venv # 4. 激活虚拟环境 source venv/bin/activate # 5. 安装项目依赖 # 优先查看是否有requirements.txt if [ -f requirements.txt ]; then pip install -r requirements.txt elif [ -f pyproject.toml ]; then # 现代项目可能使用pyproject.toml用pip安装当前目录 pip install -e . else echo 未找到标准的依赖声明文件请检查项目文档。 fi # 6. 查看项目启动说明 # 通常README.md会写明如何运行例如 # cat README.md | grep -A5 -B5 run # 7. 运行项目假设通过app.py启动 # 有时需要先设置环境变量或执行数据库迁移 # export FLASK_APPapp.py # flask db upgrade python app.py # 或者根据项目指示flask run, uvicorn main:app --reload 等关键检查点Python版本有些项目要求特定Python版本如3.8用python --version确认。系统依赖某些Python包需要系统库如libpq-devforpsycopg2。如果pip install报错提到缺失头文件需要先用apt安装对应的-dev包。环境变量很多项目使用.env文件存储配置。查看是否有.env.example文件并复制一份为.env然后填入你自己的配置。数据库初始化对于Web项目经常需要先创建数据库并运行迁移flask db init,flask db migrate,flask db upgrade。6. 虚拟环境管理中的高级技巧与避坑指南掌握了基础操作后这些技巧能让你更高效地管理环境。6.1 优化pip安装速度与稳定性国内使用PyPI官方源速度可能很慢配置国内镜像源是必备操作。可以为单个项目设置也可以配置为全局默认。临时使用pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple全局配置推荐 在用户目录下创建或修改~/.pip/pip.conf文件[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn这样之后所有的pip install命令都会默认使用清华源。6.2 处理复杂的依赖冲突当pip install报告依赖版本冲突时可以尝试以下步骤升级pippip install --upgrade pip。新版pip的依赖解析器更强大。尝试顺序安装有时一次性安装所有包会冲突可以尝试先安装核心的基础包如numpy,pandas再安装其他。使用pip-tools这是一个高级工具可以帮助你编译出兼容的依赖版本集合。先写一个requirements.in文件列出你直接需要的包然后运行pip-compile生成一个精确的requirements.txt。核武器重建环境。如果冲突无法解决最彻底的方法就是删除当前虚拟环境目录重新创建并安装。在复杂项目中这往往是最高效的解决方案。6.3 虚拟环境与IDE如VSCode、PyCharm的集成为了让IDE识别并使用你的虚拟环境需要进行配置。VSCode打开项目文件夹。按下CtrlShiftP输入 “Python: Select Interpreter”。在弹出的列表中选择路径为./venv/bin/python的解释器。之后VSCode的终端也会自动激活该环境。PyCharm打开项目。进入File - Settings - Project: 项目名 - Python Interpreter。点击齿轮图标选择Add...。选择Existing environment然后导航到你的venv/bin/python可执行文件。点击OKPyCharm会将该环境用于当前项目。6.4 环境迁移与离线部署如果你需要将一个开发好的环境部署到没有外网的生产服务器可以这样做在开发机有网上导出包列表pip freeze requirements.txt下载所有依赖包到本地目录pip download -r requirements.txt -d ./offline_packages这会将所有.whl或.tar.gz包下载到offline_packages文件夹。将整个项目目录包括offline_packages文件夹和requirements.txt打包传输到生产服务器。在生产服务器上创建虚拟环境并离线安装python3 -m venv venv source venv/bin/activate pip install --no-index --find-links./offline_packages -r requirements.txt--no-index告诉pip不要从PyPI查找--find-links指定从本地目录查找包。6.5 清理磁盘空间删除无用的缓存和包虚拟环境和pip缓存会占用不少磁盘空间定期清理很有必要。# 清理当前虚拟环境中所有已安装的包慎用会清空环境 # pip uninstall -r requirements.txt -y # 或者直接删除环境目录 rm -rf venv # 清理pip的缓存文件安全操作 pip cache purge # 对于conda清理无用的包和缓存 conda clean --all对于虚拟机或WSL2如果磁盘空间紧张除了清理包缓存还可以考虑压缩虚拟磁盘文件或者使用sudo apt autoremove和sudo apt clean清理系统不必要的包。
返回列表