Python虚拟环境与包管理详解:从入门到精通的指南

一、pip(包管理)

Python 中的 pip 是官方推荐的 包管理工具(Package Installer for Python),用于从 Python 包索引网站 PyPI 安装和管理第三方库。可以理解为 Python 世界的“软件安装器”,类似于 Linux 的 apt、Node.js 的 npm

能帮助你:

  • 安装第三方库(如 requests、flask、numpy)

  • 升级/卸载包

  • 管理依赖关系

  • 生成/解析依赖列表(requirements.txt)

  • 安装 pip:

    Python 3.4+ 已自带 pip。如果没有,你可以用以下命令安装:

    python -m ensurepip
    # 或者手动下载安装脚本:
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python get-pip.py
    

    1.常用命令大全

    安装包:

    pip install 包名
    # 例子:
    pip install requests
    

    还可以指定版本:

    pip install requests==2.31.0
    

    或安装某版本以上:

    pip install requests>=2.30
    

    卸载包:

    pip uninstall 包名
    

    查看已安装的包:

    pip list
    

    也可以使用 pip freeze 输出为 requirements.txt

    pip freeze > requirements.txt
    

    安装 requirements.txt 中的所有依赖:

    pip install -r requirements.txt
    

    小技巧:

    如果你只想导出当前项目明确使用过的依赖包(而不是环境中所有包),可以使用 pipreqs:

    pip install pipreqs
    pipreqs ./your_project_directory
    

    升级包:

    pip install --upgrade 包名
    

    查看包的详细信息:

    pip show 包名
    

    2.包安装的原理(简略流程)

    pip install requests
    

    背后流程如下:

    1. pip 向 PyPI 网站发起请求,查找名为 requests 的包。

    2. 下载 .whl(wheel 文件)或 .tar.gz 源码包。

    3. 解压、构建、安装到 Python 的 site-packages 目录。

    4. 注册到 pip 管理列表中。

    注意点

  • pip 安装的是 PyPI 上发布的包,也可以安装:

  • 本地包:pip install ./mypackage

  • Git 项目:pip install git+https://github.com/user/repo.git

  • 私有镜像:通过 -i 参数指定

  • Python >=3.8 安装包时会优先使用 .whl(wheel 格式)而不是源码包,安装更快更安全。

  • 3.虚拟环境配合 pip 使用

    为了避免全局环境冲突,我们通常用 虚拟环境(venv)

    python -m venv venv
    source venv/bin/activate      # Linux / macOS
    venv\Scripts\activate         # Windows
    pip install 包名              # 在虚拟环境中使用 pip 安装
    

    4.国内镜像源

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
    

    或全局配置:

    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    

    5.进阶技巧

    卸载所有 pip 包:

    pip freeze | xargs pip uninstall -y
    

    查看依赖树:

    pipdeptree
    

    需要先安装:

    pip install pipdeptree
    

    6.pip 本身升级

    python -m pip install --upgrade pip
    

    二、venv、virtualenv(虚拟环境)

    虚拟环境就是在你的系统中创建一个独立的 Python 解释器 + 独立 pip 包环境,它和系统环境完全隔离。

  • 每个虚拟环境有自己独立的 site-packages 目录。

  • 安装的第三方库只在当前环境中可用。

  • 不会影响系统中的全局 Python 和其他项目。

  • venvvirtualenv 的区别

    项目 venv virtualenv
    出现时间 Python 3.3 之后内置 Python 2/3 通用,需额外安装
    兼容性 仅支持 Python 3.x 支持 Python 2 和 3
    是否内置 是(Python 3 内置) 否(需 pip install virtualenv
    推荐程度 推荐用 venv(Python 3+) 旧项目/兼容性需要时用

    1.使用 venv 创建虚拟环境

    创建虚拟环境

    python -m venv myenv
    

    会在当前目录生成一个 myenv/ 目录,包含:

  • bin/Scripts/:虚拟环境的 Python 可执行文件

  • lib/:库文件(pip 安装的包)

  • pyvenv.cfg:配置文件

  • 激活虚拟环境

  • Linux/macOS:

  • source myenv/bin/activate
    
  • Windows:
  • myenv\Scripts\activate
    

    激活后,命令行前会出现虚拟环境名,如:

    (myenv) user@pc:~$
    

    在虚拟环境中使用 pip 安装依赖

    pip install requests flask
    

    这些包会被安装到 myenv/lib/site-packages 下,仅在这个环境可见。

    退出虚拟环境

    deactivate
    

    2.使用 virtualenv 创建虚拟环境(可选)

    如果你用的是 Python 2,或要手动指定 Python 版本、兼容更复杂环境,可以用:

    安装 virtualenv

    pip install virtualenv
    

    创建虚拟环境

    virtualenv venv
    # 或指定 Python 版本:
    virtualenv -p /usr/bin/python3.10 venv
    

    激活方式与 venv 相同

    3,虚拟环境常见用法

    项目依赖隔离

    每个项目都建一个虚拟环境,互不干扰。

    搭配 requirements.txt

    # 导出依赖
    pip freeze > requirements.txt
    
    # 其他机器一键安装
    pip install -r requirements.txt
    

    搭配 IDE 使用

    PyCharm / VSCode 都可以设置项目使用虚拟环境运行。

    4.常见问题

    问题 说明
    安装的库在全局能用,但项目里报错 没激活虚拟环境或用错 Python 解释器
    venv 创建失败 Python 安装不完整,缺失 ensurepip 或 PATH 配置问题
    包太多太乱 用虚拟环境 + requirements.txt 管理即可解决

    5.判断当前是否在虚拟环境中

    在 Python 代码中:

    import sys
    print(sys.prefix)  # 虚拟环境路径
    print(sys.base_prefix)  # 系统默认路径
    print(sys.prefix != sys.base_prefix)  # True 表示在虚拟环境中
    

    6.脚本:跨平台 Python 脚本

    你只需运行一次 python manage_env.py,即可完成全部流程。

    # 文件名:manage_env.py
    
    import os
    import sys
    import subprocess
    import platform
    
    # pathlib.Path 比 os.path 更现代、强大,用于操作路径对象
    from pathlib import Path
    
    VENV_DIR = "venv"
    REQUIREMENTS_FILE = "requirements.txt"
    
    # 命令执行器
    def run(cmd, shell=False):
        """运行命令并打印输出"""
        print(f"运行命令: {cmd}")
        result = subprocess.run(cmd, shell=shell, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        print(result.stdout)
        if result.returncode != 0:
            print("命令执行失败:", result.stderr)
            sys.exit(1)
    
    # 判断虚拟环境目录是否存在
    # 如果不存在,用当前 Python 创建虚拟环境(等效于手动运行 python -m venv venv)
    def create_virtualenv():
        if not Path(VENV_DIR).exists():
            run([sys.executable, "-m", "venv", VENV_DIR])
            print(f"虚拟环境已创建在 ./{VENV_DIR}")
        else:
            print(f"虚拟环境已存在:./{VENV_DIR}")
    
    # 返回一个激活虚拟环境的命令字符串
    def activate_virtualenv_cmd():
        system = platform.system()
        if system == "Windows":
            return f"{VENV_DIR}\\Scripts\\activate"
        else:
            return f"source {VENV_DIR}/bin/activate"
    
    # 构造虚拟环境中的 pip 路径 如果有 requirements.txt,就用 pip 安装 否则跳过(防止出错)
    def install_requirements():
        pip_path = Path(VENV_DIR) / ("Scripts" if platform.system() == "Windows" else "bin") / "pip"
        if Path(REQUIREMENTS_FILE).exists():
            run([str(pip_path), "install", "-r", REQUIREMENTS_FILE])
            print("已根据 requirements.txt 安装依赖")
        else:
            print("未找到 requirements.txt,跳过依赖安装")
    
    # 用 pip freeze 获取当前虚拟环境的依赖列表
    # 写入 requirements.txt 这样你就能共享项目依赖了(例如发给别人部署)
    def export_requirements():
        pip_path = Path(VENV_DIR) / ("Scripts" if platform.system() == "Windows" else "bin") / "pip"
        run([str(pip_path), "freeze", "--exclude-editable", "--all"], shell=False)
        with open(REQUIREMENTS_FILE, "w") as f:
            result = subprocess.run([str(pip_path), "freeze"], stdout=subprocess.PIPE, text=True)
            f.write(result.stdout)
        print(f"当前依赖已导出到 {REQUIREMENTS_FILE}")
    
    
    def main():
        create_virtualenv()
        install_requirements()
        export_requirements()
    
        print("\n 所有操作完成!")
        print("激活虚拟环境命令:")
        print(f" {activate_virtualenv_cmd()}")
    
    if __name__ == "__main__":
        main()
    

    总结:用虚拟环境管理依赖,是现代 Python 项目的标配。开发新项目前,先创建一个虚拟环境再动手,是好习惯。


    三、requirements.txt(依赖文件)

    requirements.txt 是一个Python项目的依赖清单文件,记录了当前项目运行所需安装的第三方库及其版本号。

    你可以把它看作是:

    “这个项目运行前需要先装哪些库、装哪些版本”。

    对于 requirements.txt

  • 项目移植方便

    同事、远程服务器、重装系统,只要有这个文件就能还原完整环境。

  • 版本可控

    指定精确版本,防止因库更新导致项目出错。

  • 配合虚拟环境使用

    虚拟环境 + requirements.txt = 完整、可复制、无污染的项目环境。

  • 文件格式

    requests==2.31.0         # 精确版本
    flask>=2.0.0             # 大于等于某版本
    httpx~=0.24.0            # 兼容某版本(类似 ^)
    pycryptodome             # 不指定版本
    git+https://github.com/psf/requests.git  # 从 Git 仓库安装
    

    你也可以加入注释(以 # 开头):

    # 网络请求库
    requests==2.31.0
    
    # Flask web 框架
    flask>=2.0.0
    

    1.如何生成 requirements.txt

    配合虚拟环境使用,安装完依赖后运行:

    pip freeze > requirements.txt
    

    这会记录当前环境下已安装的所有依赖及版本:

    certifi==2024.2.2
    charset-normalizer==3.3.2
    idna==3.6
    requests==2.31.0
    urllib3==2.2.1
    

    2.如何安装 requirements.txt 里的依赖

    pip install -r requirements.txt
    

    这条命令会自动逐行读取 requirements.txt 并安装所有依赖,并根据版本要求严格控制安装内容。

    3.注意事项

    ⚠️ 问题 建议
    环境混乱 使用 venv 虚拟环境隔离依赖
    不确定版本 一开始可以不写版本,后续稳定后用 freeze 记录版本
    出现平台相关包 不同系统生成的 requirements.txt 可能不通用,部署时注意

    4.高级用法

    指定 Python 版本安装:

    some-package; python_version >= '3.10'
    

    引用其他 requirements 文件:

    -r other_requirements.txt
    

    加入私有源(如阿里云、清华):

    --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple
    
    功能 用法 场景 完整命令示例
    条件安装 package; python_version >= '3.10' 跨版本兼容 只能写在 requirements.txt 中,不能直接在命令行写。
    📄 示例文件内容:
    flask\nuvicorn; python_version >= "3.10"
    然后命令:
    pip install -r requirements.txt
    引用文件 -r other.txt 分模块维护 📄 requirements.txt 内容:
    -r base.txt
    然后命令:
    pip install -r requirements.txt
    额外镜像 --extra-index-url 多源查找,提升下载速度 pip install requests numpy --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple
    替换镜像 --index-url 只用私有源(不连 PyPI 官方) pip install requests numpy --index-url https://pypi.tuna.tsinghua.edu.cn/simple

    5.实战项目

    示例项目结构

    my_spider_project/
    ├── main.py                 # 主程序
    ├── utils/
    │   └── js_runner.py        # JS 解密工具
    ├── scripts/
    │   └── encrypt.js          # 加密 JS(从网页提取或手动整理)
    ├── requirements.txt
    

    scripts/encrypt.js(模拟加密逻辑)

    function getEncryptedToken(input) {
        return btoa(input.split("").reverse().join(""));
    }
    

    utils/js_runner.py(JS 加密执行器)

    from py_mini_racer import py_mini_racer
    from pathlib import Path
    
    def get_token(input_str: str) -> str:
        js_code = Path("scripts/encrypt.js").read_text(encoding="utf-8")
        ctx = py_mini_racer.MiniRacer()
        ctx.eval(js_code)
        return ctx.call("getEncryptedToken", input_str)
    

    main.py(主程序)

    import requests
    from bs4 import BeautifulSoup
    from utils.js_runner import get_token
    
    def main():
        raw = "username=admin&time=1234567890"
        token = get_token(raw)
    
        headers = {
            "User-Agent": "Mozilla/5.0",
            "X-Token": token
        }
    
        url = "https://example.com/data"
        resp = requests.get(url, headers=headers)
    
        if resp.status_code == 200:
            soup = BeautifulSoup(resp.text, "lxml")
            for item in soup.select(".item"):
                print(item.text)
        else:
            print("请求失败:", resp.status_code)
    
    if __name__ == "__main__":
        main()
    

    requirements.txt(配套依赖)

    requests==2.31.0
    beautifulsoup4==4.12.3
    lxml==5.2.1
    py_mini_racer==0.6.0
    

    实战说明

    模块 用途
    encrypt.js 模拟从网页逆向分析提取的 JS 加密逻辑
    js_runner.py 使用 py_mini_racer 运行 JS,获取 token
    requests 用于发送 HTTP 请求
    BeautifulSoup 用于解析 HTML 页面数据

    四、poetry、pipenv(更高级的包管理工具)

    poetrypipenv 是比 pip + venv 更高级、更现代的包管理工具
    它们帮你自动管理虚拟环境、依赖、版本锁定、项目元数据等,一般大型项目、框架、库开发都会用它们。

    传统方式使用 pip + venv + requirements.txt 虽然足够,但有这些缺点:

    问题 描述
    手动管理虚拟环境 每次都要自己创建/激活
    版本不可重复构建 requirements.txt 不保证一致性(版本浮动)
    没有依赖分组 难以区分「开发」和「生产」依赖
    元信息不好写 setup.py 太繁琐,版本号不集中

    于是,poetrypipenv 就出现了,帮助你自动化、结构化、模块化管理一切。

    1.pipenv 详解

    特点

  • 自动创建虚拟环境(不用你管路径)

  • 自动生成/更新锁文件 Pipfile.lock

  • Pipfile 替代 requirements.txt,更清晰(分开发和生产依赖)

  •  Pipfile 示例

    [[source]]
    url = "https://pypi.tuna.tsinghua.edu.cn/simple"
    verify_ssl = true
    
    [packages]
    requests = "*"
    py_mini_racer = "==0.6.0"
    
    [dev-packages]
    pytest = "*"
    
    [requires]
    python_version = "3.10"
    

    常用命令

    pipenv install requests          # 安装 + 写入 Pipfile
    pipenv install --dev pytest      # 安装为开发依赖
    pipenv shell                     # 进入虚拟环境
    pipenv run python main.py        # 执行命令
    pipenv lock                      # 生成 Pipfile.lock(可还原环境)
    

    2.poetry 详解

    特点

  • 全自动依赖管理、版本锁定、虚拟环境

  • 支持项目发布(生成 wheel,推到 PyPI)

  • 强依赖版本管理、支持插件

  • 统一用 pyproject.toml(未来 Python 官方推荐标准)

  •  pyproject.toml 示例

    [tool.poetry]
    name = "my-js-spider"
    version = "0.1.0"
    description = "一个支持JS逆向的爬虫项目"
    authors = ["你 <you@example.com>"]
    
    [tool.poetry.dependencies]
    python = "^3.10"
    requests = "^2.31.0"
    py-mini-racer = "^0.6.0"
    
    [tool.poetry.dev-dependencies]
    pytest = "^8.0"
    
    [build-system]
    requires = ["poetry-core"]
    build-backend = "poetry.core.masonry.api"
    

    常用命令

    poetry init                        # 创建 pyproject.toml
    poetry add requests               # 添加依赖
    poetry add --dev pytest           # 添加开发依赖
    poetry install                    # 自动创建虚拟环境并安装依赖
    poetry run python main.py         # 执行
    poetry shell                      # 进入虚拟环境
    poetry export -f requirements.txt > requirements.txt  # 兼容传统格式
    

    3.总结对比:

    pipenv vs poetry

    对比项 pipenv poetry
    依赖文件 Pipfile + Pipfile.lock  pyproject.toml + poetry.lock
    虚拟环境管理 自动  自动
    发布库 不支持  支持(推荐)
    社区趋势 使用率下降  越来越主流
    易用性 简单、接近 pip 风格  更系统化,有学习成本
    推荐程度 一般项目可用  建议用于中大型项目 / 开源库

    pip vs poetry

    项目 pip + requirements.txt poetry
    虚拟环境管理 需手动用 venv 自动创建和管理
    依赖锁定 requirements.txt 手动写 自动生成 poetry.lock
    包管理 依赖不统一 统一在 pyproject.toml
    发布 PyPI 包 需手动写 setup.py 等 一条命令搞定

    4.如何安装 现代化 Poetry 包管理工具

    安装 Poetry

    🔹 1)Linux / macOS 安装方式:

    打开终端,输入下面命令 :

    curl -sSL https://install.python-poetry.org | python3 -

    🔹 2)Windows 安装方式(PowerShell):

    打开 PowerShell,输入以下命令 :

    (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

    配置环境变量

    安装后 Poetry 可能在以下路径:

  • Linux/macOS: ~/.local/bin/poetry

  • Windows: %APPDATA%\Python\Scripts\poetry.exe

  • 你需要把上面的路径加入到你的系统环境变量 PATH 中。

    Linux / macOS 添加路径:

    编辑你的 shell 配置文件:

    nano ~/.bashrc  # 或 ~/.zshrc
    

    加入这行:

    export PATH="$HOME/.local/bin:$PATH"
    

    然后执行:

    source ~/.bashrc  # 或 source ~/.zshrc
    

    Windows 添加路径:

    1. 打开“系统环境变量” → “环境变量”

    2. 找到 PATH,点“编辑”

    3. 添加路径:

    C:\Users\<你的用户名>\AppData\Roaming\Python\Scripts\
    

    验证安装是否成功

    在终端或 PowerShell 中运行:

    poetry --version
    

    输出示例:

    Poetry (version 1.8.2)
    

    说明安装成功!

    Poetry 卸载命令

    如果要卸载 Poetry:

    curl -sSL https://install.python-poetry.org | python3 - --uninstall
    

    5.poetry 项目示例

    下面是一个完整的可复用爬虫 + JS逆向项目,使用现代化项目管理工具 Poetry 构建,适合做实战项目,也适合后续拓展为 Web 安全/反爬系统。

    项目结构

    js_spider_demo/
    ├── js_spider_demo/               # 主模块
    │   ├── __init__.py
    │   ├── main.py                   # 主入口:爬虫逻辑
    │   └── js_runner.py              # 执行 JS 解密逻辑
    ├── scripts/
    │   └── encrypt.js                # 从网页提取的 JS 加密代码
    ├── tests/
    │   └── test_js_runner.py         # 单元测试(可选)
    ├── pyproject.toml                # poetry 管理配置文件
    ├── README.md
    └── .gitignore
    

    pyproject.toml(Poetry 配置)

    [tool.poetry]
    name = "js_spider_demo"
    version = "0.1.0"
    description = "一个使用 py_mini_racer 执行 JS 的爬虫项目"
    authors = ["你的名字 <you@example.com>"]
    
    [tool.poetry.dependencies]
    python = "^3.10"
    requests = "^2.31.0"
    py-mini-racer = "^0.6.0"
    beautifulsoup4 = "^4.12.3"
    lxml = "^5.2.1"
    
    [tool.poetry.dev-dependencies]
    pytest = "^8.1.1"
    
    [build-system]
    requires = ["poetry-core"]
    build-backend = "poetry.core.masonry.api"
    

    scripts/encrypt.js

    function generateToken(input) {
        return btoa(input.split("").reverse().join(""));
    }
    

    js_spider_demo/js_runner.py

    from py_mini_racer import py_mini_racer
    from pathlib import Path
    
    def generate_token(data: str) -> str:
        js_code = Path("scripts/encrypt.js").read_text(encoding="utf-8")
        ctx = py_mini_racer.MiniRacer()
        ctx.eval(js_code)
        return ctx.call("generateToken", data)
    

    js_spider_demo/main.py

    import requests
    from bs4 import BeautifulSoup
    from js_spider_demo.js_runner import generate_token
    
    def main():
        raw_data = "username=admin&time=1234567890"
        token = generate_token(raw_data)
    
        headers = {
            "User-Agent": "Mozilla/5.0",
            "X-Token": token
        }
    
        url = "https://example.com/data"
        resp = requests.get(url, headers=headers)
    
        if resp.status_code == 200:
            soup = BeautifulSoup(resp.text, "lxml")
            items = soup.select(".item")
            for item in items:
                print(item.text)
        else:
            print("请求失败:", resp.status_code)
    
    if __name__ == "__main__":
        main()
    

    安装与运行

    # 1. 初始化虚拟环境并安装依赖
    poetry install
    
    # 2. 进入虚拟环境
    poetry shell
    
    # 3. 运行主程序
    python js_spider_demo/main.py
    
    # 或不进入虚拟环境直接运行
    poetry run python js_spider_demo/main.py
    

    可选测试 tests/test_js_runner.py

    from js_spider_demo.js_runner import generate_token
    
    def test_generate_token():
        assert generate_token("abc123") == "321cba"
    
    poetry run pytest
    

    :pytest 是一个 Python 测试框架,用于编写和运行测试。它可以自动发现并执行测试文件中的测试函数,检查代码的正确性。

    pytest自动发现的“测试文件”规则

    pytest 会自动运行以下类型的文件:

  • 文件名 test_ 开头,如:

  • test_math.py

  • test_api.py

  • 文件名 _test 结尾,如:

  • math_test.py

  • api_test.py

  • 这些文件可以放在任意目录下(但通常放在 tests/ 文件夹中)。

    不符合命名的文件不会被自动运行,除非你手动指定它。

    作者:shenyan~

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python虚拟环境与包管理详解:从入门到精通的指南

    发表回复