一、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
背后流程如下:
-
pip 向 PyPI 网站发起请求,查找名为
requests
的包。 -
下载
.whl
(wheel 文件)或.tar.gz
源码包。 -
解压、构建、安装到 Python 的
site-packages
目录。 -
注册到 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 和其他项目。
venv
和 virtualenv
的区别:
项目 | 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(更高级的包管理工具)
poetry
和 pipenv
是比 pip + venv 更高级、更现代的包管理工具。
它们帮你自动管理虚拟环境、依赖、版本锁定、项目元数据等,一般大型项目、框架、库开发都会用它们。
传统方式使用 pip + venv + requirements.txt
虽然足够,但有这些缺点:
问题 | 描述 |
---|---|
手动管理虚拟环境 | 每次都要自己创建/激活 |
版本不可重复构建 | requirements.txt 不保证一致性(版本浮动) |
没有依赖分组 | 难以区分「开发」和「生产」依赖 |
元信息不好写 | setup.py 太繁琐,版本号不集中 |
于是,poetry
和 pipenv
就出现了,帮助你自动化、结构化、模块化管理一切。
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 添加路径:
-
打开“系统环境变量” → “环境变量”
-
找到
PATH
,点“编辑” -
添加路径:
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/
文件夹中)。
不符合命名的文件不会被自动运行,除非你手动指定它。