python打卡day30@浙大疏锦行
知识点回顾:
- 导入官方库的三种手段
- 导入自定义库/模块的方式
- 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致)
作业:自己新建几个不同路径文件尝试下如何导入
具体操作步骤:
-
在桌面上新建一个文件夹
project
(这就是项目的根目录)。 -
在
project
文件夹内新建main.py
(主程序入口)。 -
在
project
内新建lib
文件夹,并在lib
内新建utils.py
。 -
在
project
内新建subpackage
文件夹:-
在
subpackage
内新建module1.py
。 -
在
subpackage
内新建subsub
文件夹,并在subsub
内新建module2.py
。
-
-
关键步骤:在每个文件夹(
subpackage
和subsub
)内新建一个空文件__init__.py
,告诉Python这是“包”(类似一个标志牌)。
2. 编写模块内容
(1) lib/utils.py
# 这是一个工具函数
def greet():print("Hello from utils")
(2) subpackage/module1.py
# 导入系统模块(Python自带的库)
import sys
import os# 动态添加项目根目录到Python的搜索路径
root_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
sys.path.append(root_path)# 绝对导入:从项目根目录下的lib文件夹导入utils模块中的greet函数
from lib.utils import greetdef func1():greet()print("This is module1")# 相对导入:从当前包(subpackage)的subsub子包中导入module2的func2函数
from .subsub.module2 import func2
(3) subpackage/subsub/module2.py
import sys
import os# 动态添加项目根目录到Python的搜索路径
root_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
sys.path.append(root_path)# 绝对导入:从项目根目录下的lib文件夹导入utils模块中的greet函数
from lib.utils import greetdef func2():greet()print("This is module2")# 相对导入:从上级包(subpackage)导入module1模块
from .. import module1
(4) main.py
import sys
import os# 确保项目根目录在Python的搜索路径中
root_path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(root_path)# 从subpackage包中的module1模块导入func1和func2
from subpackage.module1 import func1, func2if __name__ == "__main__":func1() # 调用func1func2() # 调用func2
3. 运行测试
运行方式一:在项目根目录执行
-
打开终端(或命令行),进入
project
文件夹:cd /Users/yourname/Desktop/project
-
运行主程序:
python main.py
-
预期输出:
Hello from utils This is module1 Hello from utils This is module2
运行方式二:在项目上级目录执行
-
在终端中进入项目上级目录(比如桌面):
cd /Users/yourname/Desktop
-
运行主程序:
python project/main.py
-
同样会成功!因为代码中动态添加了根目录路径。