关于Python:4. 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 的区别

项目venvvirtualenv
出现时间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

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

pip vs poetry

项目pip + requirements.txtpoetry
虚拟环境管理需手动用 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/ 文件夹中)。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值