【Python训练营打卡】day30 @浙大疏锦行
DAY 30 模块和库的导入
知识点回顾:
1. 导入官方库的三种手段
2. 导入自定义库/模块的方式
3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致)
作业:自己新建几个不同路径文件尝试下如何导入
场景一:
main.py和 rectangle.py都在同一目录
目录结构:
项目根目录
├── main.py
└── rectangle.py
运行方案:直接在终端python main.py
# rectangle.py
import mathdef calculate_area(length, width):return length * width
# main.py
from circle import calculate_arearadius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")# 或者注释上面的,用下面的方法
# import circle
# radius = 5
# area = circle.calculate_area(radius)
# print(f"半径为 {radius} 的圆,面积是: {area}")
尝试在终端上运行python main.py
场景2:
main.py和 rectangle.py都在根目录的子目录 model下
目录结构:
项目根目录
└── model
├── __init__.py (推荐添加,将 model 目录标记为包)
├── main.py
└── rectangle.py
运行方案:
1. 运行命令:python model/main.py
2. 进入路径:cd xxx(main的相对路径),然后执行python main.py
(注意如果先cd后,就不能采用第一个命令了)
# rectangle.py
import mathdef calculate_area(length, width):return length * width
# main.py
from circle import calculate_arearadius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
场景3:
main.py在根目录rectangle.py在子目录model下
目录结构:
项目根目录
├── main.py
└── model
├── __init__.py (必需添加,将 model 目录标记为一个可导入的包)
└── rectangle.py
运行方案:直接在终端python main.py
import mathdef calculate_area(length, width):return length * width
from model.rectangle import calculate_area #注意是model.rectanglewidth = 4
length = 6
area = calculate_area(width, length)
print(f"长为 {length},宽为 {width} 的矩形,面积是: {area}")
场景4:
main.py和rectangle.py都在根目录的子目录model下,并且model下还有子目录 utils(跨目录导入)
项目根目录
├── rectangle2.py
└── utils/
├── __init__.py (必需添加,将 model 目录标记为一个可导入的包)
└── rectangle.py
└── model/
└── main.py
运行方式
python -m model.main
如果直接使用python model/main.py,会报错,
当使用 python -m model.main 时,Python 会将当前目录(即项目根目录)添加到 sys.path 的开头。
from utils import calculate_areawidth = 4
length = 6
area = calculate_area(width, length)
print(f"长为 {length},宽为 {width} 的矩形,面积是: {area}")
import mathdef calculate_area(length, width):return length * width
源码的查看
如果第三方库是纯python写的,往往在函数上按住ctrl即可进入函数内部查看源代码。
但是很多第三方库为了性能,底层是用其他语言写的,这里我们计算机视觉库OpenCV为例。
OpenCV核心是用C++编写的(C++可以显著提高性能),但它通过Python等其他语言的接口(bindings)使得这些功能可以在Python环境中被调用。这些接口是通过一种叫做Python/C API的技术实现的,其中C++的功能被封装成Python模块,使得Python用户可以像使用纯Python编写的库一样使用OpenCV。
OpenCV的核心是用C++编写,并且已经编译成二进制文件,编译后的二进制文件可以在不同操作系统上运行,Python中的用户通常不能直接看到方法的源代码。
二进制文件是机器语言,处理器可以直接理解和执行无需翻译,二进制语言反汇编是很困难的,用二进制语言除了效果好外,也是让用户无法看到源代码,保护了自己的知识产权。
这意味着:
●二进制文件dll文件:当你在Python中导入OpenCV库(通import cv2),你实际上是在调用预先编译好的二进制文件。这些文件包含了实现OpenCV功能的可执行代码,而非人类可读的源代码。
●接口封装:用户只能看到Python函数和对象的接口(即函数的定义,不包括实现的细节)。这也意味着无法从利用ctrl跳转到函数内部,pycharm的debugger功能同理也无法看到内部结构。
●文档和源代码:尽管在Python中不能直接看到C++的源代码实现,用户可以参考官方文档来了解各个函数和方法的用法。如果需要查看实现细节,可以访问OpenCV的[GitHub仓库](https://github.com/opencv/opencv)查看C++源代码。
@浙大疏锦行