当前位置: 首页 > java >正文

Python虚拟环境的使用

不同的python项目,可能会使用不同的python版本,也会使用同一个包的不同版本。为了解决依赖冲突问题,我们为不同项目建立不同的虚拟环境,来实现依赖包的隔离+版本锁定。

venv

venv是python(3.3以上版本)自带的轻量级虚拟环境管理工具。

1、创建虚拟环境

# 创建名为 myenv 的虚拟环境目录
python -m venv myenv  

2、进入虚拟环境

source myenv/bin/activate

3、安装依赖包

pip install requests numpy  # 安装单个包
pip install -r requirements.txt  # 通过文件批量安装
pip list  # 查看当前环境已安装的包

4、退出虚拟环境

deactivate

5、实践中的注意事项

将虚拟环境目录(如 .venv)置于项目根目录,并通过 .gitignore 忽略,避免纳入版本控制。

定期运行 pip freeze > requirements.txt 保存依赖列表,确保环境可复现

Pipenv

参考文档:https://github.com/pypa/pipenv,https://pipenv.pypa.io/zh-cn/latest/basics.html

Pipenv 是 Python 的官方推荐(由 PyPA 认可)的依赖管理和虚拟环境工具。它旨在将 pip(包安装)、virtualenv(虚拟环境创建)和 Pipfile(依赖声明)的功能结合在一个命令行工具中,提供更简洁、更一致的工作流。

1、安装Pipenv

pip install pipenv  # 推荐用户级安装

2、创建虚拟环境

pipenv install

会生成一个Pipfile,格式如下

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"[packages]
django = "~=4.0"          # 兼容版本(4.0.x)
requests = "*"             # 任意版本(不推荐)
flask = { version = ">=2.0.1", extras = ["dotenv"] }  # 带额外特性
numpy = "==1.23.5"         # 精确版本[dev-packages]
pytest = ">=7.0"           # 最小版本
coverage = "*"[requires]
python_version = "3.10"    # 指定Python版本[scripts]
start = "python manage.py runserver"
test = "pytest -v"
lint = "flake8 ."

3、进入虚拟环境

pipenv shell

退出虚拟环境

deactivate

4、生成锁定版本的Pipfile.lock文件

手动编辑 Pipfile 后,运行 pipenv lock 来生成新的 Pipfile.lock,确保依赖被锁定。

5、命令的说明

  check         Checks for PyUp Safety security vulnerabilities and againstPEP 508 markers provided in Pipfile.clean         Uninstalls all packages not specified in Pipfile.lock.graph         Displays currently-installed dependency graph information.install       Installs provided packages and adds them to Pipfile, or (if nopackages are given), installs all packages from Pipfile.lock          Generates Pipfile.lock.open          View a given module in your editor.requirements  Generate a requirements.txt from Pipfile.lock.run           Spawns a command installed into the virtualenv.scripts       Lists scripts in current environment config.shell         Spawns a shell within the virtualenv.sync          Installs all packages specified in Pipfile.lock.uninstall     Uninstalls a provided package and removes it from Pipfile.update        Runs lock, then sync.upgrade       Update the lock of the specified dependency / sub-dependency,but does not actually install the packages.verify        Verify the hash in Pipfile.lock is up-to-date.

6、实践中的注意事项

总是将 PipfilePipfile.lock 一起提交到版本控制系统,确保团队环境一致。

在生产环境中根据 Pipfile.lock 安装精确依赖 (推荐方式):pipenv install --deploy --ignore-pipfile

在Docker中使用Pipenv部署Python应用时,无需创建虚拟环境:pipenv install --system --deploy --ignore-pipfile

7、Dockerfile 示例

# 阶段 1: 构建环境
FROM python:3.10-slim as builder# 安装系统依赖(根据应用需要调整)
RUN apt-get update && \apt-get install -y --no-install-recommends gcc build-essential && \rm -rf /var/lib/apt/lists/*# 安装 pipenv
RUN pip install --no-cache-dir pipenv# 设置工作目录
WORKDIR /app# 复制依赖声明文件(利用 Docker 缓存层)
COPY Pipfile Pipfile.lock ./# 安装依赖到系统(不创建虚拟环境)
RUN pipenv install --system --deploy --ignore-pipfile# 阶段 2: 运行时镜像
FROM python:3.10-slim as runtime# 安装运行时依赖(如需要)
# RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*# 从构建阶段复制已安装的包
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin# 设置工作目录
WORKDIR /app# 复制应用代码
COPY . .# 设置环境变量
ENV PYTHONUNBUFFERED=1 \PYTHONDONTWRITEBYTECODE=1# 暴露端口(根据应用调整)
EXPOSE 8000# 启动命令
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
http://www.xdnf.cn/news/14158.html

相关文章:

  • SpringBoot源码解析(十一):条件注解@ConditionalOnClass的匹配逻辑
  • 如何调优Kafka
  • LeetCode 第71题 简化路径(繁琐)
  • thinkphp8提升之查询
  • Nature Machine Intelligence 北京通研院朱松纯团队开发视触觉传感仿人灵巧手,实现类人自适应抓取
  • 开心灿烂go开发面试题
  • 如何自动化测试 DependencyMatcher 规则效果(CI/CD 集成最佳实践)
  • 免费OCPP协议测试工具
  • FreeRTOS定时器
  • C++/OpenCV地砖识别系统结合 Libevent 实现网络化 AI 接入
  • 如何写出优秀的单元测试?
  • 17.vue.js响应式和dom更新
  • java33
  • Java重构实战:小步快跑的高效策略分析
  • 【嵌入式硬件实例】-555定时器实现烟雾和易燃气体泄露检测
  • JAVA-springboot 异常处理
  • 15故障排查
  • CAD中DWG到DXF文件解析(一)
  • ELK日志文件分析系统——E(Elasticsearch)
  • 【算法深练】二分答案:从「猜答案」到「精准求解」的解题思路
  • RT-Thread Studio SDK管理器安装资源包失败
  • 考研好?还是找工作好?
  • 灵界猫薄荷×贴贴诱发机制详解
  • 深度学习——基于卷积神经网络的MNIST手写数字识别详解
  • 【AS32系列MCU调试教程】驱动开发:AS32驱动库的集成与应用实例
  • Python经验,日志模块logging配置实现双重分割-同时添加时间和大小
  • Android 中 OkHttp 的自定义 Interceptor 实现统一请求头添加
  • BeckHoff_FB --> F_SEQ_X2_Robot 函数
  • Step-Audio-AQAA 解读:迈向「纯语音」交互的端到端 LALM 新里程
  • 【0.2 漫画操作系统原理】