网站首页 > 技术文章 正文
对话实录
小白:(崩溃)我装了包却ImportError,救命!
专家:(掏出魔法书)掌握包导入功能,告别导入噩梦!
import导入基础三连击
概念 | 解释 |
import | 即导入,就是在import的位置将代码文件拷贝过去。 |
模块(module) | python中一个.py文件定义为一个模块。 常用的几种模块导入方式: import module_name from module_name import * from module_name import func_name,class_name from module_name import * |
包(package) | 指软件包,包含__init__.py、modules、及子目录等。 常用的几种导入方式: import package_name import package_name as p import package.module import package.module as pm from package.module import * from package import module1, module2, module3, ... ... from package import * 包的导入和模块导入基本一致,只不过导入包时会先执行包内的__init__.py。如果只是导入一个包import package而不指定导入任何模块,且包中的__init__.py文件中没有定义其他的初始化操作,那么包下面的模块是无法被自动导入的。 |
Import导入时搜索路径 | 装载module代码时python解释器需要先搜索到对应的.py文件,搜索顺序为:
|
实战案例
为了形象地解释,建一个test文件夹,其中文件夹A和B的目录结构,如下:
案例1 在A_B.py中定义__all__用来模糊导入from moduleA import *
专家:python文件中设置了 __all__ 的值,那么则按照 __all__ 指定的子包或者模块进行加载。
示例:定义A_B.py文件,__all__中增加A_B 和C_D函数,不包含E_F函数
在A目录的__init__.py中通过from A_B import *时,E_F函数并不会被导入,上述执行后会报错
案例2 配置sys.path,在B文件夹的run.py文件下导入A包中的模块。
在run.py中import A,并执行run.py,发现报错如下:
发现在上面的例子中__init__.py文件执行时并为报错,现在在B文件夹执行run.py就会报错找不到A_B模块,那是因为在执行python文件时在本目录下,或者在上面基本概念介绍时的搜索路径中并未找到A_B模块,所以报错。
当我们在run.py中将A目录增加到sys.path中时,执行正常
import sys
sys.path.append("/Volumes/UNTITLED/test/A")
import A
执行结果:
开始导入A_B模块
使用A_B函数
使用E_F函数
案例 3:相对导入(包内)
在一个 Python 包内部,我们可以使用相对导入来引用其他模块。假设项目结构如下:
mypackage/
├── __init__.py
├── utils.py
└── core.py
在core.py中,可以这样导入utils.py:
# 从当前目录导入utils模块
from . import utils
# 从上级目录的subpkg目录导入tools模块
from ..subpkg import tools
案例 4:条件导入
当我们希望使用某个高性能模块,但该模块可能未安装时,可以采用条件导入。
try:
# 尝试导入rapidjson,它比标准json模块更快
import rapidjson as json
except ImportError:
# 如果导入失败,使用标准json模块作为回退方案
import json
案例 5:动态导入
在某些情况下,我们需要在运行时动态决定导入哪个模块,这时可以使用__import__函数。
module_name = "os"
module = __import__(module_name)
print(module.path.exists("/"))
血泪陷阱
循环导入
循环导入是指两个或多个模块相互导入,这会导致死循环。
# a.py
from b import func
# b.py
from a import other_func # 形成死循环
命名冲突
当导入的模块或函数具有相同的名称时,会发生命名冲突。
from mylib import sqrt
from math import sqrt # 后者会覆盖前者
# 正确做法,通过别名区分
import math
from mylib import sqrt as my_sqrt
隐藏的 pip 缓存
pip会缓存已下载的包,这可能导致安装旧版本的包。
# 错误示范,可能安装缓存中的旧版本包
pip install package
# 正确做法,禁止使用缓存并升级包
pip install --no-cache-dir --upgrade package
专家工具箱
1. 虚拟环境管理
虚拟环境是 Python 项目管理的重要工具,以下是常见的虚拟环境操作:
# 创建名为myenv的虚拟环境
python -m venv myenv
# 激活虚拟环境(Linux/Mac)
source myenv/bin/activate
# 激活虚拟环境(Windows)
myenv\Scripts\activate
2. 依赖管理
在项目开发过程中,我们需要记录项目的依赖关系,以便在其他环境中安装相同的包。
# 生成requirements.txt文件,记录当前环境中安装的所有包及其版本
pip freeze > requirements.txt
# 从requirements.txt文件中安装所有依赖包
pip install -r requirements.txt
小白:(献上键盘)原来包导入这么讲究
专家:(扶起小白)记住:好的包管理是项目成功的一半!
常用命令清单
- pip list:查看已安装的包
- pip show:查看包的详细信息
- pip uninstall:卸载包
- python -m site:查看包的搜索路径
猜你喜欢
- 2025-05-11 一文学会用PyInstaller把Python 程序打包成一个独立的可执行文件
- 2025-05-11 如何在python中安装和配置kivy库
- 2025-05-11 深入了解Python的setup.py文件
- 2025-05-11 Python程序员必看!10分钟搞定项目打包:PyInstaller保姆级教程
- 2025-05-11 Python程序开发入门(第六章)函数与模块
- 2025-05-11 Python保姆级安装教程(CPU+GPU)
- 2025-05-11 Python 中的函数和模块
- 2025-05-11 python 进阶突破——内置模块(Standard Library)
- 2025-05-11 Python中h5py与netCDF4模块在Anaconda环境的下载与安装
- 2025-05-11 ubuntu部署python脚本为系统服务
- 05-27程序员用 Python 爬取抖音高颜值美女
- 05-27YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
- 05-27「工具推荐」世界上最简单的人脸识别库 44.7 star
- 05-27开源人脸识别系统源码推荐
- 05-27Go 人脸识别教程
- 05-27Python 深度学习之人脸识别(yolo+facenet)
- 05-27简单的Py人脸识别
- 05-27Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 82℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)