python 安装依赖和导入模块 详解

安装依赖

后续进阶的操作和教程: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

    bash 复制代码
    source venv/bin/activate
  • Windows (CMD)

    cmd 复制代码
    venv\Scripts\activate
  • Windows (PowerShell)

    powershell 复制代码
    venv\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

它会:

  1. 使用 http://pip.baidu.com/... 作为下载源
  2. 忽略 SSL 校验(因为 --trusted-host
  3. 安装当前目录(.)中的项目为"可编辑"状态

❓为什么最后要写 -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 ✅ 推荐 更简洁 与上面等价
相关推荐
近津薪荼3 小时前
C++ vector容器底层深度剖析与模拟实现
开发语言·c++
木易 士心3 小时前
为什么 Promise 比 setTimeout 先执行?——JavaScript 事件循环与异步顺序完全指南
开发语言·javascript·ecmascript
念恒123063 小时前
Python(for循环)
python·学习
海清河晏1113 小时前
数据结构 | 链式队列
开发语言·数据结构·链表
咱那飘逸的长发3 小时前
Trae java项目配置全局maven和jdk
java·python·maven
晔子yy3 小时前
[JAVA探索之路]带你从零开始实现线程池
java·开发语言
爱上好庆祝3 小时前
学习js的第六天(js基础的结束)
开发语言·前端·javascript·学习·ecmascript
Rust研习社3 小时前
Rust 的 Box、Rc、Arc 到底怎么选?
开发语言·后端·rust
码界筑梦坊3 小时前
116-基于Flask的健身房会员锻炼数据可视化分析系统
python·信息可视化·数据分析·flask·毕业设计