观前提醒:本文详细介绍了Python环境的结构,介绍了python虚拟环境基础用法,以及python中的环境&依赖管理

0.什么是Python环境

Python环境是指一个特定的设置,其中包含了运行Python代码所需的一系列软件工具和包。这个环境可以包括Python解释器、一组安装的包、模块以及相关的配置设置。Python环境可以帮助你管理依赖关系,确保不同项目之间的依赖隔离,避免版本冲突。

基本上,Python环境可以分为两种:

  1. 全局环境

    • 全局环境是指安装在操作系统上的Python环境。
    • 它是所有Python程序的默认环境,除非特别指定使用其他环境。
    • 修改全局环境会影响系统上所有使用这个Python解释器的项目。
  2. 虚拟环境

    • 虚拟环境是一个独立的环境,可以有自己的Python解释器和一组包。
    • 它使得不同项目可以拥有不同的依赖,不会互相干扰。
    • 虚拟环境通常使用venv模块创建,该模块是Python 3的标准库的一部分。
    • 虚拟环境位于项目文件夹中,便于管理和迁移。

一、Python环境的结构

Python环境由几个关键组件组成,它们共同支持Python代码的运行和管理。这些组件包括:

1. Python解释器

Python解释器是最核心的组件,它是一个软件包,能够执行Python代码。你可以从Python官网下载,并且有多个版本可供选择(如Python 2.x已停止更新,而Python 3.x是目前的主流)。

2. 标准库

Python的标准库提供了广泛的模块和函数,它们被内置在Python解释器中。标准库涵盖了从文本处理到网络通信等许多功能。

3. 第三方库

除了标准库之外,Python的强大功能还得益于社区提供的大量第三方库。这些库可以通过包管理工具如pip安装,并用于各种特定的任务和应用程序开发。

4. 包管理器

Python使用包管理器来安装、更新、卸载和管理第三方库的依赖。最广泛使用的包管理器是pip,它与Python标准库一起分发。

二、Python虚拟环境

Python虚拟环境是一个独立的目录树,其中安装了特定版本的Python解释器以及一系列附加包。当你激活一个虚拟环境时,你的系统路径(PATH)会暂时修改,以便任何对Python解释器或Python脚本的调用都会使用虚拟环境中的版本。

为什么使用虚拟环境?

  • 依赖管理:不同的项目可能需要不同版本的库,虚拟环境可以避免版本冲突。
  • 权限问题:在系统级别安装库可能需要管理员权限,虚拟环境则可以在用户级别安装。
  • 清洁和整洁:虚拟环境保持你的全局Python环境清洁,便于管理。
  • 复制环境:虚拟环境可以帮助你复制和分享环境配置,便于协作和部署。

如何创建和使用Python虚拟环境?

使用venv(推荐方法)

venv是Python自带的虚拟环境创建工具,不需要额外安装。

  1. 创建虚拟环境

    python3 -m venv myenv
    #在Windows上,Python命令通常只是python,而不是python3
    #所以需要使用python -m venv myenv
    

    这会在当前目录下创建一个名为myenv的虚拟环境。

  2. 激活虚拟环境

    • 在Unix或Mac上:
      source myenv/bin/activate
      
    • 在Windows上:
      myenv\Scripts\activate
      
  3. 安装包
    在激活的虚拟环境中使用pip安装包只会影响当前环境。

    pip install requests
    
  4. 退出虚拟环境

    deactivate
    

使用virtualenv

virtualenv是一个独立的第三方包,更早之前的Python版本使用这个包来创建虚拟环境。

  1. 安装virtualenv

    pip install virtualenv
    
  2. 创建虚拟环境

    virtualenv myenv
    
  3. 激活和退出
    激活和退出的步骤与venv相同。

使用Pipenv

Pipenv自动管理虚拟环境和依赖文件,它结合了pip的包管理和venv的环境管理。

  1. 安装Pipenv

    pip install pipenv
    
  2. 创建和激活虚拟环境

    pipenv shell
    

    这将自动创建虚拟环境并激活它。

  3. 安装包并更新Pipfile

    pipenv install requests
    

使用Poetry

Poetry处理依赖管理和包的创建,使用pyproject.toml文件来管理依赖。

  1. 安装Poetry
    pip install poetry
    
  2. 初始化项目和虚拟环境

    poetry init
    poetry install
    

    虚拟环境的依赖管理

    一个新创建的Python环境中包含哪些依赖呢?
    一个新创建的虚拟环境默认情况下是相当“干净”的,它不会包含任何外部安装的第三方包。它所包含的仅仅是Python标准库中的模块以及少数必要的服务模块(如pip、setuptools和wheel),这些模块是用于安装和管理其他包的基础工具。
    标准库是Python的一部分,提供了许多内建的模块和函数,用于执行系统管理任务、数学运算、文件操作等常见操作。标准库的模块在所有Python环境中都可用,无须额外安装。
    pip 是Python的包安装器,它允许你从Python Package Index(PyPI)安装其他Python软件包。
    setuptools 是一个Python包开发过程中的一个增强工具集,它帮助你更容易地构建和分发Python包,特别是那些依赖于其他包的包。
    wheel 是一个与pip配合使用的Python分发包格式,用于替代egg格式,它设计用于更快速地安装Python包。
    当你创建一个新的虚拟环境时,标准库以及这些基础服务模块会被安装在虚拟环境中,但是除此之外,不会有其他第三方库。这样做的好处是你可以从一个干净的基础开始构建你的项目,只安装你项目实际需要的包,避免了不必要的依赖和潜在的版本冲突。
    要查看虚拟环境中已安装的包,你可以激活虚拟环境并使用命令 pip listpip freeze。在一个全新的虚拟环境中,这个列表通常很短,只包含上述提到的几个包。
    这里我们对比一下系统环境和新建环境中的已安装的包:(如果你不想你的环境像我的环境一样糟糕,那就多多利用虚拟环境吧)

    虚拟环境的pip源

    当虚拟环境被激活后,pip会优先使用虚拟环境内的配置文件。你可以创建或修改这个文件来指定pip源。

    • 在Linux和macOS上,配置文件通常位于$VIRTUAL_ENV/pip.conf
    • 在Windows上,配置文件通常位于%VIRTUAL_ENV%\pip.ini

    通过修改pip的配置文件就可以修改虚拟环境的pip源

举个栗子

下面我们通过一个具体的例子来展示如何使用虚拟环境以及 piprequirements.txt 来管理Python项目的依赖。
下面我们构建一个简单的Web应用,它使用Flask框架。还需要requests库来处理HTTP请求。

步骤1:创建虚拟环境

在项目的根目录下创建一个虚拟环境。这样做可以确保你安装的依赖不会影响到系统中的其他Python项目。

python -m venv venv

这将在当前目录下创建一个名为 venv 的虚拟环境。要激活这个虚拟环境,你需要运行以下命令:

  • 在Unix或macOS上:

    source venv/bin/activate
    
  • 在Windows上:

    venv\Scripts\activate
    

步骤2:安装依赖

现在,安装项目所需的依赖。

pip install flask requests

这将安装Flask和requests库,以及它们的依赖。

步骤3:生成requirements.txt

接下来,你需要创建一个 requirements.txt 文件,它将包含所有已安装包的精确版本号。

pip freeze > requirements.txt

这个命令会生成一个新的 requirements.txt 文件,里面包含了所有依赖及其版本。打开这个文件,你会看到类似以下内容:

click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
requests==2.24.0
Werkzeug==1.0.1

步骤4:使用requirements.txt安装依赖

现在,如果你想在另一个环境(可能是另一台机器或另一个开发者的电脑上)安装这些依赖,你只需激活虚拟环境并运行以下命令:

pip install -r requirements.txt

这将在新环境中安装与原始环境中完全相同版本的依赖。
当然我我们也可以创建多个依赖文件:
如果你的应用有开发依赖(如测试框架)和生产依赖,可以创建两个文件:requirements.txtrequirements-dev.txt,分别管理生产和开发依赖。

三、环境容器化

Python容器化:简化部署与扩展

Python在多个领域蓬勃发展,从Web开发到数据科学,从自动化脚本到机器学习。但是,随着Python应用的复杂性增加,确保应用在不同环境中能够一致运行变得越来越重要。这正是容器化技术发挥作用的地方。在本篇博客中,我们将探究如何使用容器化来部署Python应用,提高其可移植性与可伸缩性。

容器化简介

容器化是一种轻量级的、可执行的软件包技术,它将应用程序及其所有依赖、配置和运行时环境封装在一个容器中。与传统的虚拟机相比,容器直接在宿主机的操作系统上运行,减少了额外的负担。

Docker: 容器化的代名词

当我们谈论容器化时,最著名的工具非Docker莫属。Docker利用了Linux的容器技术,如Cgroups和Namespace,提供了一个独立的环境来运行应用程序。

为什么Python项目适合容器化?

  • 环境一致性:避免了“在我的机器上可以运行”的问题。
  • 依赖隔离:每个容器都有自己的环境,不同容器间依赖不会相互冲突。
  • 快速部署:容器可以在几秒钟内启动,使得部署变得迅速而简单。
  • 易于扩展和管理:容器化的应用可以轻松地横向扩展,满足不断变化的负载需求。

容器化Python应用的步骤

让我们通过一个简单的例子来说明如何容器化一个Python Web应用。

步骤1:准备Python应用

假设你有一个简单的Flask应用,代码如下:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

步骤2:编写Dockerfile

Dockerfile是一个文本文档,包含了所有用来构建镜像的命令。

# 使用官方Python运行时作为父镜像
FROM python:3.8-slim

# 将工作目录设置为/app
WORKDIR /app

# 将当前目录内容复制到位于/app中的容器中
COPY . /app

# 安装requirements.txt中指定的任何所需包
RUN pip install --no-cache-dir -r requirements.txt

# 使端口80可用于此容器外的环境
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行app.py
CMD ["python", "app.py"]

这个Dockerfile创建了一个简单的Flask应用的Docker镜像。

步骤3:构建Docker镜像

在包含Dockerfile的应用程序根目录下,运行以下命令来构建镜像:

docker build -t my-python-app .

步骤4:运行容器

一旦镜像构建完成,你可以运行一个容器:

docker run -p 4000:80 my-python-app

这个命令告诉Docker运行镜像并映射端口4000到容器的端口80。