安装依赖
后续进阶的操作和教程:https://editor.csdn.net/md/?not_checkout=1\&articleId=155285421#Python__484

✅ 一、前提:项目结构
假设你有一个 Python 项目:
myproject/
├── main.py
├── requirements.txt
└── setup.py (可选)
⚠️ 重点:所有依赖操作都应在虚拟环境中进行!避免污染全局 Python 环境
使用
venv创建一个独立的 每一个Python 环境都会包含自己的pip(基础工具)、site-packages(用于安装第三方库)其中的
python版本是 你所创建venv时候的 版本
📦 二、推荐方法:使用 pip + requirements.txt(最常用)
✅ 方法1:直接用 pip 安装单个包(临时或测试)
bash
# 安装某个包,比如 requests
pip install requests
# 安装特定版本(如 2.28.1)
pip install requests==2.28.1
# 安装来自 GitHub 的包(注意:需要先安装 git)
pip install git+https://github.com/requests/requests.git@v2.28.1
🔍 注释:
pip是 Python 标准包管理工具。- 不建议在全局环境下用
pip install,容易造成冲突。- 常用于快速测试或开发阶段。
✅ 方法2:使用 requirements.txt 文件(强烈推荐)
这是标准做法:将所有依赖写在一个文件里,便于复现环境。
Step 1:创建 requirements.txt 文件
txt
# requirements.txt
# 这是一个注释行,以 # 开头会被忽略
# 使用 pip freeze 生成
# 也可以手动添加版本号
# Web 框架
Flask==2.3.3
# HTTP 请求库
requests>=2.28.0,<3.0.0
# 数据处理
pandas==2.0.3
# 数据库连接
psycopg2-binary==2.9.6
# 日志
loguru==0.7.0
# 可选依赖(非必需)
pytest>=7.0.0
black==23.1.0
🔍 注释:
- 使用
==表示精确版本(安全稳定)。- 使用
>=表示大于等于某个版本,允许更新但不跳大版本。~=表示"波浪符"版本控制(更智能):例如numpy~=1.21→ 允许 1.21.x,但不允许 1.22。- 你可以用
pip show package查看已安装包信息。
Step 2:安装这些依赖(在虚拟环境中)
bash
# 从 requirements.txt 安装所有依赖
pip install -r requirements.txt
🔍 注释:
-r表示 read from file(从文件读取)。- 所有依赖会自动安装,包括它们的子依赖。
- 安装后可以运行
pip list查看当前已安装包。
Step 3:导出当前环境的所有依赖(生成 requirements.txt)
bash
# 在虚拟环境中运行(确保只安装了你需要的包)
pip freeze > requirements.txt
🔍 注释:
pip freeze输出当前环境中所有安装的包及其版本。类似pip list,但是用=连接,所以可以 生成requirements.txt此外!!!使用pip list命令可以列出已安装的所有包,而使用pip freeze命令则可以导出已安装包的列表
如果要
k=v格式列出所有的:pip list --format=freeze
>将输出重定向到文件,覆盖原有内容。✅ 推荐:每次完成开发或部署前,执行一次
pip freeze > requirements.txt来记录当前环境
🫠从第137行开始安装后续依赖,而不是从头开始---❤️🤩🤔
不合法的写法!因为 --index-url 必须在开头
pip install -r requirements.txt --skip-lines=136
shell
# 查看第137行内容(Linux/macOS)
sed -n '137p' requirement.txt
# 生成新文件(从第137行开始)
tail -n +137 requirement.txt > temp_requirement.txt
# 安装
pip install -r temp_requirement.txt
# 删除临时文件
rm temp_requirement.txt
🫠重新创建干净的虚拟环境------❤️
shell
# 退出当前虚拟环境
deactivate
# 删除旧的虚拟环境
rm -rf venv
# 重新创建虚拟环境
python -m venv venv
source venv/bin/activate
# 重新安装依赖(建议清理requirement.txt中的冲突版本)
pip install -r liantiao_ai_robot/requirement.txt
🔐 三、使用虚拟环境(必须操作!)------❤️
为了隔离项目、防止冲突,请务必使用虚拟环境。
1、创建虚拟环境(推荐方式:使用 venv)
bash
# 在项目根目录下创建虚拟环境
python -m venv venv
# 或者用 Python 3.8+
python3 -m venv env
🔍 注释:
venv是 Python 内置模块。- 会创建一个名为
venv的文件夹(你也可以叫它env)。- 包含独立的 Python 解释器和
pip。
2、激活虚拟环境
进去之后 ==只是依赖变了,其他的当前项目路径(pwd) 以及 执行的命令都没变!!!==正常操作就可以呢!!!
-
Linux/macOS:
bashsource venv/bin/activate -
Windows (CMD):
cmdvenv\Scripts\activate -
Windows (PowerShell):
powershellvenv\Scripts\Activate.ps1
🔍 注释:
- 激活后命令行前会有
(venv)提示,表示你现在在虚拟环境中- 所有
pip install都会作用于这个环境。
3、安装依赖
bash
# 从 requirements.txt 安装所有依赖
pip install -r requirements.txt
4、运行项目、调试
5、退出虚拟环境
bash
deactivate
❌ 不要提交
venv/到 Git!✅ 应该提交
requirements.txt!
四、不小心安装到了全局怎么办呢------❤️🤩🤔
✅ 方法1:卸载全局的包
你可以列出已安装的包,并手动删除它们。
# 查看所有已安装的包(包括全局的)
pip list
# 找出哪些是你从 requirements.txt 安装的,然后一个个卸载
pip uninstall 包名
或者更高效地一次性卸载:
✅ 方法2:# 假设你已经保存了原来的 requirement.txt
# 直接用 pip uninstall -r 要求文件(但注意这是全局的!)
pip uninstall -r requirements.txt
✅ 最后:检查一波
pip list // 看看是不是只有pip , setuptools 了呢
⚠️ 注意:pip uninstall -r requirements.txt 是危险操作,会把你在当前环境中安装的所有包都卸载!所以请谨慎使用。
但是这样还是 删除不干净!!!
shell
# 删除通过pip安装的所有依赖包,只保留pip和setuptools
// 方法一
rm -rf venv
python -m venv venv
source venv/bin/activate # Linux/macOS
// 方法二
# 1. 列出所有已安装的包(带版本)
pip freeze > installed_packages.txt
# 2. 过滤出除了 'pip' 和 'setuptools' 之外的包
grep -v "pip\s" installed_packages.txt | grep -v "setuptools\s" > to_uninstall.txt
# 3. 批量卸载
while read -r package; do
if [[ "$package" =~ ^[^=]+ ]]; then
pip uninstall -y "${package%%=*}"
fi
done < to_uninstall.txt
# 清理临时文件
rm installed_packages.txt to_uninstall.txt
# 检查是否剩下了重要的两个,如果不对,还是执行 方法一吧
pip freeze
五、特殊的requirements.txt
--index-url http://
--trusted-host
-e .
❓ 可以正常安装吗?
这样的
requirements.txt能用pip install -r requirements.txt安装吗?
✅ 答案:✅ 可以!
虽然这个写法看起来有点奇怪(尤其是 --index-url 和 --trusted-host),但这是合法的,并且能被 pip install -r 正确解析。
🔍 原因解释
这是一个 requirements.txt 文件的内容。注意:
--index-url:指定从 哪个镜像源下载包--trusted-host:允许连接不安全的主机(比如没有 HTTPS 的私有仓库)-e .:表示"以可编辑模式安装当前目录下的包"
⚠️ 注意:
这些参数是 pip 的命令行选项,不是 Python 包名!
所以如果你直接跑:
bash
pip install -r requirements.txt
它会:
- 使用
http://pip.baidu.com/...作为下载源 - 忽略 SSL 校验(因为
--trusted-host) - 安装当前目录(
.)中的项目为"可编辑"状态
❓为什么最后要写 -e .?这样有什么好处?------❤️
🎯 答案:-e . 的作用是 ------ "可编辑模式安装"
这在开发过程中非常重要!
💡 什么是"可编辑模式"(editable install)?
当你运行:
bash
pip install -e .
它会在系统中创建一个 符号链接(symbolic link) 或 egg-link 文件,指向当前目录的项目代码。
举个例子:
假设你的项目结构是:
myproject/
├── setup.py
└── myproject/
└── __init__.py
执行:
bash
cd myproject
pip install -e .
会把 myproject/ 目录作为一个 Python 包,安装到你的虚拟环境中,但:
✅ 你的代码文件没有被复制到
site-packages,而是通过软链接引用。✅ 从而达到修改原始代码后,无需重新安装即可生效!
🌟 好处如下:
| 优点 | 说明 |
|---|---|
| 🛠️ 开发效率高 | 改代码 → 立即生效,不用 pip uninstall + pip install |
| 🔄 多模块共享 | 可以多个项目依赖同一个本地库,而不会重复打包 |
| 🧪 调试方便 | 你可以用 IDE 直接打断点调试 myproject/__init__.py |
| 🔁 自动更新 | 如果你在 Git 中拉取了新代码,下次运行程序自动加载最新版 |
类比 Java:就像你在 IDEA 中把
src/main/java添加为模块路径,而不是编译成 JAR 后再引入。
⚠️ 注意事项
- 必须有
setup.py文件,并正确声明项目信息 - 不能用于非 Python 项目(如 C++ 扩展等)
✅ 如何编写 setup.py?(配合 -e . 使用)
python
from setuptools import setup, find_packages
setup(
name="myproject",
version="0.1.0",
packages=find_packages(),
install_requires=[
"flask>=2.0",
"sqlalchemy>=1.4",
# 其他依赖...
],
entry_points={
'console_scripts': [
'myapp=main:main',
],
},
)
然后运行:
bash
pip install -e .
六、进阶做法:分离配置和安装逻辑
建议你将 requirements.txt 拆分为多个:
✅ requirements.txt(生产环境)
txt
flask==2.3.3
sqlalchemy==2.0.22
pymysql==1.1.0
✅ requirements-dev.txt(开发环境)
txt
-r requirements.txt
-e .
pytest>=7.0
black
isort
然后开发时运行:
bash
pip install -r requirements-dev.txt
🧪 最终测试
确保一切正常:
bash
# 安装
pip install -r requirements.txt
# 验证是否安装成功
python -c "import myproject; print(myproject.__version__)"
# 修改代码看看是否生效
echo "print('Hello from dev!')" >> myproject/__init__.py
python -c "import myproject; print(myproject.__doc__)"
Python 几种导入模块的方法
普通导入
下面是我们最常遇到的几种导入方式,按优先级和用途分类讲解。
| 方法 | 语法 | 说明 |
|---|---|---|
1. import module |
import math |
导入整个模块,用 module.func() 访问 |
2. from module import name |
from math import sqrt |
只导入指定名称,直接用 sqrt() |
3. from module import * |
from math import * |
导入所有非私有成员(慎用) |
4. import module as alias |
import math as m |
给模块起别名 |
5. from module import name as alias |
from math import sqrt as sq |
导入并重命名 |
6. import package.module |
import mypackage.core |
从包中导入子模块 |
7. from package import module |
from mypackage import core |
从包中导入模块 |
1. import module ------ 导入整个模块
python
import math
print(math.sqrt(16)) # 输出 4.0
print(math.pi) # 输出 3.14...
✅ 优点:清晰明确,不会污染命名空间
❌ 缺点:使用起来要加前缀
2. from module import name ------ 导入特定名称
python
from math import sqrt, pi
print(sqrt(16)) # 输出 4.0
print(pi) # 输出 3.14...
✅ 优点:简洁,不用写 math.
⚠️ 注意:可能造成命名冲突(比如你也定义了 pi)
3. from module import * ------ 导入全部(慎用!)
python
from math import *
print(sqrt(16)) # OK
print(sin(0.5)) # OK
❌ 危险!会导致:
- 命名冲突(覆盖已有的变量或函数)
- 无法知道用了哪些名字
- 不利于代码维护和调试
🔧 建议:只在交互式环境中使用(如 Jupyter Notebook),生产代码中避免!
4. import module as alias ------ 模块别名
python
import numpy as np
import pandas as pd
df = pd.DataFrame()
arr = np.array([1, 2, 3])
✅ 大量使用于流行库(NumPy、Pandas、Matplotlib)
5. from module import name as alias ------ 名称别名
python
from math import sqrt as sq
from time import sleep as wait
print(sq(9)) # 3.0
wait(1) # 等待 1 秒
✅ 适用于长函数名或避免冲突
6. import package.module ------ 导入包中的模块
python
# 结构:
# project/
# └── mypackage/
# ├── __init__.py
# └── core.py
import mypackage.core
mypackage.core.do_something()
📌 注意:必须有 __init__.py 才能成为包
7. from package import module ------ 从包中导入模块
python
from mypackage import core
core.do_something()
等价于上面,但注意这相当于 import + from
特殊导入技巧 & 实用场景
✅ 动态导入(运行时决定)
python
module_name = "os"
module = __import__(module_name)
print(module.name)
👉 用于插件系统、配置驱动加载
✅ 自动导入子模块(在 __init__.py 中)
python
# mypackage/__init__.py
from .core import do_work
from .utils import helper
__all__ = ['do_work', 'helper']
然后用户可以直接:
python
from mypackage import do_work
✅ 条件导入(根据环境)
python
try:
import requests
except ImportError:
print("requests not installed")
小结对比表
| 方法 | 是否推荐 | 优点 | 缺点 |
|---|---|---|---|
import module |
✅ 推荐 | 清晰、安全 | 有点啰嗦 |
from module import func |
✅ 推荐 | 简洁 | 可能冲突 |
from module import * |
❌ 不推荐 | 快速方便 | 危险、难维护 |
import module as alias |
✅ 推荐 | 标准做法 | 有别名 |
from module import name as alias |
✅ 推荐 | 灵活 | 别名混乱 |
import package.module |
✅ 推荐 | 明确结构 | 路径较长 |
from package import module |
✅ 推荐 | 更简洁 | 与上面等价 |