1. 项目概述:为什么我们需要虚拟环境?
在Ubuntu上折腾项目,尤其是Python项目,相信不少朋友都踩过同一个坑:系统里装了一堆不同版本的库,A项目需要numpy==1.21,B项目却要求numpy==1.24,最后版本冲突搞得焦头烂额,甚至把系统自带的Python环境搞崩。虚拟环境(Virtual Environment)就是为解决这个问题而生的“隔离舱”。它允许你为每个项目创建一个独立的Python运行环境,在这个环境里安装的包、配置的路径都只对当前项目生效,不同项目之间互不干扰。这就像给每个项目分配了一个专属的、干净的房间,你在房间里怎么折腾,都不会影响到客厅(系统环境)和其他房间(其他项目)。
对于在Ubuntu上进行开发、数据科学、机器学习或者运维部署的朋友来说,掌握虚拟环境的创建和使用是必备技能。无论是从GitHub拉取一个开源项目来运行,还是自己开发一个应用,第一步往往就是搭建一个专属的虚拟环境。这不仅能保证项目依赖的纯净和可复现性,也极大地简化了后续的部署和迁移流程。今天,我就以一个资深开发者的视角,带你从零开始,在Ubuntu上完成创建虚拟环境、安装项目依赖、并成功运行项目的完整闭环。我们会聚焦于最通用、最轻量的venv模块,同时也会对比介绍conda等工具,让你知其然更知其所以然。
2. 核心工具选型:venv vs conda vs 其他
在Ubuntu上创建Python虚拟环境,主流工具有两个:Python标准库自带的venv和第三方发行版Anaconda/Miniconda附带的conda。选择哪个,取决于你的具体场景。
2.1 Python venv:轻量、标准、推荐
venv是Python 3.3+版本内置的模块,无需额外安装(只要你的Python3是从官方源安装的)。它的最大优点是轻量和标准。创建的环境只包含最基本的Python解释器和pip,非常干净。它通过修改环境变量PATH,将当前环境的python和pip命令指向隔离目录,从而实现环境隔离。
适用场景:
- 纯粹的Python项目开发。
- 项目依赖主要通过
pip从PyPI安装。 - 追求环境最小化,部署到生产服务器。
- 你希望使用系统包管理器(如
apt)管理非Python依赖(如数据库客户端、系统库)。
注意:
venv创建的环境是“软链接”到系统Python解释器的,它并不复制一份完整的Python。这意味着如果你升级了系统的Python,虚拟环境可能受到影响。最佳实践是为每个项目固定Python版本。
2.2 Conda:跨语言、强大的包管理
Conda本身是一个独立的开源包管理和环境管理系统,它不仅可以管理Python包,还能管理R、C/C++、Java等多种语言的包,甚至能安装非Python的二进制工具。它通过创建完全独立的目录树来实现环境隔离,环境之间更加彻底。
适用场景:
- 数据科学、机器学习项目,经常需要复杂的数据栈(如NumPy, SciPy, Pandas, TensorFlow, PyTorch)。
- 项目依赖包含大量需要编译的C扩展库,
conda提供了预编译好的二进制包,避免复杂的编译环境配置。 - 需要方便地安装和管理非Python依赖,比如
ffmpeg、cuda工具包等。 - 在Windows系统上,
conda是管理科学计算环境的利器。
一个常见问题的解答:在搜索热词中看到“conda创建新虚拟环境显示the channel is not accessible”。这通常是因为.condarc配置文件中的镜像源地址失效或网络问题。解决方法通常是更换为国内的镜像源(如清华、中科大源),或者检查网络连接。
我们的选择:对于大多数通用的Python Web开发、脚本编写、自动化任务,venv因其简单、标准而足够好用。本文将主要使用venv进行演示,并在关键步骤指出与conda的异同。
3. 实操准备:Ubuntu系统与Python基础配置
在开始创建环境之前,我们需要确保系统处于一个良好的起点。这里假设你使用的是Ubuntu 22.04 LTS或20.04 LTS,这是目前最稳定的两个长期支持版本。
3.1 确保Python3与pip可用
首先,打开你的终端(Ctrl+Alt+T)。Ubuntu 22.04默认已经安装了Python 3.10。我们可以通过以下命令确认:
python3 --version pip3 --version如果pip3提示未安装,可以使用Ubuntu的包管理器apt来安装:
sudo apt update sudo apt install python3-pip -y实操心得:始终使用
python3和pip3命令来明确指定使用的是Python 3。虽然有些教程会教你通过update-alternatives将python命令链接到python3,但在生产服务器或需要严格版本控制的场景下,保持明确性可以避免很多潜在的混淆和错误。
3.2 升级pip至最新版本
系统自带的pip版本可能较旧。使用最新版的pip可以确保包安装过程更稳定,支持更多新特性。
pip3 install --upgrade pip升级后,可以通过pip --version(注意,升级后通常可以直接使用pip命令)来确认版本。
4. 核心环节一:使用venv创建虚拟环境
现在,进入我们项目的核心目录。假设你的项目名为my_awesome_project,位于家目录下。
cd ~ mkdir my_awesome_project && cd my_awesome_project4.1 创建虚拟环境
在当前目录下,执行创建虚拟环境的命令:
python3 -m venv venv这条命令的含义是:调用Python 3的venv模块,在当前目录(.)下创建一个名为venv的虚拟环境目录。你也可以取其他名字,比如.venv、env等,但venv是社区常见的约定。
命令执行后,你会看到当前目录下多了一个名为venv的文件夹。它的内部结构大致如下:
venv/ ├── bin/ # 存放可执行文件,如python, pip, activate脚本 ├── include/ # C头文件 ├── lib/ # 所有安装的Python包都在这里的site-packages下 └── pyvenv.cfg # 环境配置文件4.2 激活虚拟环境
创建环境后,它只是一个孤立的目录。我们需要“激活”它,让当前的终端会话知道,后续所有的python和pip命令都应该指向这个隔离环境。
source venv/bin/activate激活成功后,你的命令行提示符(PS1)通常会发生变化,最前面会显示虚拟环境的名称(venv),如下所示:
(venv) user@host:~/my_awesome_project$现在,你可以验证一下Python和pip的路径:
which python which pip输出应该指向~/my_awesome_project/venv/bin/下的文件,而不是/usr/bin/。
重要注意事项:激活操作只对当前这个终端标签页或会话有效。如果你新开一个终端标签页,需要重新进入项目目录并再次执行
source venv/bin/activate。当你完成工作,想退出虚拟环境时,只需输入命令deactivate,提示符就会恢复原样。
4.3 使用conda创建环境(备选方案)
如果你选择使用conda,步骤有所不同。首先你需要安装Miniconda或Anaconda。以Miniconda为例,从官网下载安装脚本后:
bash Miniconda3-latest-Linux-x86_64.sh # 安装后,重启终端或运行 `source ~/.bashrc`创建环境的命令是:
conda create --name my_env python=3.9 # 创建一个名为my_env,Python版本为3.9的环境 conda activate my_env # 激活环境 conda deactivate # 退出环境conda的环境默认安装在~/miniconda3/envs/目录下,与项目目录分离。这对于管理多个使用相同Python版本但不同包的项目可能不够直观,但便于集中管理所有环境。
5. 核心环节二:在虚拟环境中安装项目依赖
环境激活后,我们就进入了这个干净的“房间”。接下来,就要根据项目的需要,在这个房间里布置家具——安装Python包。
5.1 理解依赖管理文件:requirements.txt
一个规范的项目,通常会包含一个requirements.txt文件,它列出了项目运行所需的所有第三方包及其精确版本。例如:
Django==4.2.7 requests>=2.28.0,<3.0.0 pandas numpy==1.24.3==:指定精确版本。>=:指定最低版本。<:指定最高版本(不包含)。- 只写包名:安装最新稳定版。
5.2 安装依赖
假设你的项目目录下已经有requirements.txt文件,安装命令非常简单:
(venv) pip install -r requirements.txtpip会自动从PyPI(Python包索引)下载并安装所有列出的包及其依赖项。安装过程中,你会看到大量的下载和安装日志。
如果没有requirements.txt文件怎么办?
- 手动安装:如果你知道项目需要哪些包,可以逐个安装:
pip install django requests pandas。 - 生成requirements.txt:如果你是在一个已有的、能运行的项目中,但缺少依赖声明文件,可以在虚拟环境中安装好所有必需的包后,运行以下命令生成它:
(venv) pip freeze > requirements.txtpip freeze会列出当前环境中所有已安装的包及其版本,输出重定向到文件就生成了requirements.txt。务必在虚拟环境中执行此操作,否则会导出系统全局的所有包!
5.3 使用国内镜像源加速下载
直接从PyPI下载可能会很慢。我们可以使用国内的镜像源来大幅提升下载速度。在安装时通过-i参数指定镜像源:
(venv) pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple常用的国内镜像源有:
- 清华:
https://pypi.tuna.tsinghua.edu.cn/simple - 阿里云:
https://mirrors.aliyun.com/pypi/simple/ - 中国科技大学:
https://pypi.mirrors.ustc.edu.cn/simple/
如果你想设置为默认,可以创建或修改~/.pip/pip.conf文件(Linux/macOS)或%APPDATA%\pip\pip.ini(Windows):
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn5.4 安装特定版本的Python包
有时项目需要特定版本的包,或者你需要降级/升级某个包。使用pip install指定版本即可:
(venv) pip install pandas==1.5.3 # 安装精确版本 (venv) pip install --upgrade pandas # 升级到最新版本 (venv) pip install pandas~=1.5.0 # 安装兼容版本,相当于>=1.5.0, <1.6.06. 核心环节三:运行你的项目
依赖安装完毕,虚拟环境已经准备就绪,是时候让项目跑起来了。运行项目的具体命令因项目类型而异。
6.1 运行Python脚本
对于单个的Python脚本文件(例如main.py或app.py),直接使用虚拟环境中的Python解释器运行即可:
(venv) python main.py6.2 运行Django项目
典型的Django项目会有一个manage.py文件作为入口。
- 首先,确保已安装Django(通常在
requirements.txt中已包含)。 - 应用数据库迁移(如果项目使用数据库):
(venv) python manage.py migrate - 创建超级用户(如果需要后台管理):
(venv) python manage.py createsuperuser - 启动开发服务器:
默认情况下,服务器会运行在(venv) python manage.py runserverhttp://127.0.0.1:8000。在浏览器中访问这个地址,你应该能看到Django的欢迎页面或你的应用。
6.3 运行Flask项目
Flask项目通常有一个主应用文件,例如app.py或run.py。
- 设置Flask应用入口(如果需要):
(venv) export FLASK_APP=app.py # 对于Windows CMD: set FLASK_APP=app.py # 对于Windows PowerShell: $env:FLASK_APP="app.py" - 启动开发服务器:
服务器通常运行在(venv) flask run # 或者 python app.py (如果app.py中直接调用了app.run())http://127.0.0.1:5000。
6.4 运行从GitHub克隆的项目
这是搜索热词中的高频需求:“github上的项目怎么运行”、“从github下载项目并运行”。通用步骤如下:
- 克隆项目:
git clone https://github.com/username/repo.git cd repo - 查看项目说明:务必首先阅读
README.md文件!作者通常会在里面写明安装和运行步骤、依赖的Python版本、是否需要特殊配置等。 - 创建并激活虚拟环境(如前所述)。
- 安装依赖:按照
README.md的指示,可能是pip install -r requirements.txt,也可能是pip install -e .(以可编辑模式安装当前目录的包)或使用poetry/pipenv等更现代的依赖管理工具。 - 环境变量与配置:很多项目需要配置环境变量(如数据库连接字符串、API密钥)。通常会有
.env.example或config.example.py文件,你需要复制一份并填入自己的配置。 - 初始化数据库:对于Web项目,可能需要运行迁移脚本。
- 运行项目:根据
README.md的启动命令执行。
7. 虚拟环境的管理与维护
虚拟环境不是创建一次就一劳永逸的,我们需要知道如何管理它们。
7.1 查看已安装的包
(venv) pip list # 列出所有已安装的包及其版本 (venv) pip show package_name # 查看某个特定包的详细信息7.2 更新包
更新所有包到符合版本约束的最新版(谨慎操作,可能破坏兼容性):
(venv) pip list --outdated # 先查看哪些包有更新 (venv) pip install --upgrade package_name # 更新单个包更安全的方式是定期根据更新的requirements.txt重新安装。
7.3 卸载包
(venv) pip uninstall package_name7.4 删除虚拟环境
当你确定某个项目环境不再需要时,直接删除其目录即可。首先确保你已经退出了该虚拟环境(deactivate)。
deactivate # 如果环境处于激活状态,先退出 rm -rf venv/ # 删除名为venv的虚拟环境目录对于conda环境,使用conda remove --name my_env --all。
7.5 虚拟环境的迁移与复现
虚拟环境本身(venv文件夹)不建议直接复制到其他机器,因为其中包含的路径可能是硬编码的。正确的做法是:
- 在源环境中生成精确的依赖列表:
pip freeze > requirements.txt。 - 将项目代码和
requirements.txt文件传到新机器。 - 在新机器上创建新的虚拟环境,并运行
pip install -r requirements.txt。
这保证了环境的高度可复现性。对于更复杂的依赖和环境管理,可以考虑使用Docker容器化技术。
8. 常见问题与排查技巧实录
在实际操作中,你几乎一定会遇到一些问题。下面是我总结的一些高频问题及其解决方案。
8.1 创建虚拟环境失败
- 问题:
Command 'python3' not found或The virtual environment was not created successfully... - 排查:
- 确认Python3已安装:
python3 --version。 - 确保安装了
python3-venv包(某些最小化安装的Ubuntu可能没有):sudo apt install python3-venv。 - 检查目标目录的写入权限。
- 确认Python3已安装:
8.2 激活脚本执行报错
- 问题:
source venv/bin/activate后提示Permission denied或脚本错误。 - 排查:
- 检查激活脚本是否存在:
ls -la venv/bin/activate。 - 可能是文件格式问题(如在Windows创建,在Linux使用)。可以尝试用
dos2unix工具转换:dos2unix venv/bin/activate。 - 确保你使用的是
bash或zsh等兼容shell,而不是fish或csh(它们有自己对应的激活脚本,位于venv/bin/activate.fish)。
- 检查激活脚本是否存在:
8.3 安装包时速度慢或超时
- 问题:
pip install卡在下载阶段或报超时错误。 - 解决:
- 首要方案:使用国内镜像源,如前文所述。
- 增加超时时间:
pip install --default-timeout=100 package_name。 - 检查网络连接,特别是如果使用了代理,需要为
pip配置代理:pip install --proxy=http://user:pass@proxy-server:port package_name。
8.4 包版本冲突
- 问题:
pip在安装时提示无法满足所有包的版本要求,例如Cannot install package-a==1.0 because package-b requires package-a>=2.0。 - 解决:
- 这是依赖管理的核心难题。首先尝试安装主要的核心包(如Django, Flask),让
pip自动协调依赖。 - 如果不行,查看错误信息,尝试手动安装一个兼容的版本组合。有时需要稍微降低或提高某个核心包的版本。
- 使用
pip check命令来检查已安装包之间的依赖兼容性。 - 考虑使用更先进的依赖解析工具,如
pip-tools(pip-compile/pip-sync) 或poetry。
- 这是依赖管理的核心难题。首先尝试安装主要的核心包(如Django, Flask),让
8.5 运行项目时提示模块未找到(ModuleNotFoundError)
- 问题:
python app.py报错ModuleNotFoundError: No module named 'xxx'。 - 排查:
- 首先确认虚拟环境是否已激活!这是最常见的原因。检查命令行提示符是否有
(venv)前缀。 - 确认该模块是否已安装:
pip list | grep xxx。 - 如果模块已安装但依然报错,可能是Python路径问题。确保你的项目目录结构正确,或者尝试使用
PYTHONPATH环境变量:PYTHONPATH=/path/to/your/project python app.py。
- 首先确认虚拟环境是否已激活!这是最常见的原因。检查命令行提示符是否有
8.6 Conda环境相关错误
- 问题:
conda create失败,提示The channel is not accessible或PackagesNotFoundError。 - 解决:
- 配置国内镜像源。执行以下命令添加清华源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes - 清除索引缓存:
conda clean -i。 - 指定更宽泛的包版本,或者从其他渠道(如
conda-forge)寻找包:conda install -c conda-forge package_name。
- 配置国内镜像源。执行以下命令添加清华源:
9. 进阶技巧与最佳实践
掌握了基础操作后,下面这些技巧能让你的虚拟环境使用体验更上一层楼。
9.1 使用 .venv 作为环境目录名
越来越多的工具(如Python的venv模块本身、一些IDE)开始默认寻找或推荐使用.venv作为虚拟环境目录名。它是一个隐藏文件夹,可以让项目根目录更整洁,并且被许多.gitignore模板默认忽略,避免误提交。
python3 -m venv .venv source .venv/bin/activate9.2 将虚拟环境目录排除在版本控制之外
虚拟环境目录(venv/或.venv/)绝对不应该提交到Git等版本控制系统。确保你的.gitignore文件包含如下行:
# Virtual Environment venv/ .venv/ env/9.3 使用 pipreqs 智能生成 requirements.txt
pip freeze会导出环境中的所有包,包括你不需要的间接依赖。pipreqs工具可以只扫描项目代码中import的语句,生成最小化的依赖列表,更干净。
# 首先在虚拟环境中安装 pip install pipreqs # 然后在项目根目录运行 pipreqs . --encoding=utf8 --force9.4 为不同Python版本创建环境
有时你需要测试项目在不同Python版本下的兼容性。可以使用deadsnakesPPA(适用于Ubuntu)安装多个Python版本,然后用指定版本创建虚拟环境:
# 添加deadsnakes PPA并安装Python 3.11 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update sudo apt install python3.11 python3.11-venv # 使用Python 3.11创建虚拟环境 python3.11 -m venv venv-3119.5 在Shell配置中简化激活流程
如果你经常在几个项目间切换,可以在~/.bashrc或~/.zshrc中添加别名或函数来快速激活环境。例如,添加一个函数:
function act() { if [ -d ".venv" ]; then source .venv/bin/activate elif [ -d "venv" ]; then source venv/bin/activate else echo "未找到虚拟环境目录 (.venv 或 venv)。" fi }保存后执行source ~/.bashrc,以后进入项目目录,只需输入act即可尝试激活虚拟环境。
虚拟环境是Python开发者的基石工具,它代表的是一种清晰、隔离、可复现的项目管理哲学。从今天起,养成“每个项目,先建环境”的习惯,你会发现项目依赖管理带来的烦恼将大大减少。无论是运行一个从GitHub上发现的有趣脚本,还是部署一个复杂的企业级应用,这套流程都能为你提供一个坚实可靠的起点。