Python 导入模块、文件、包、自定义路径包
测试环境,假设:
主文件绝对路径:/home/ubu/py_test/main.py
模块文件:/home/ubu/py_test/con.py
模块目录:/home/ubu/py_test/modules/tt.py
模块目录:/home/ubu/py_test/modules/test/t1.py
模块目录:/home/ubu/py_test/modules/test/t2.py
其他项目:/home/ubu/m2c/mm.py
一、 引入模块文件及子目录模块文件
1.主文件 main.py 导入 同目录下的 con.py 文件
1 | import con.py |
2.文件 main.py 导入 modules 目录下的 tt.py 文件全部内容
1 | from modules import tt |
3. 文件 main.py 导入 modules 目录下的 tt.py 文件里的 test 函数(假设有个test函数)
1 | from modules.tt import test |
4. 文件 main.py 导入包含多级目录 modules 目录下的 t1.py 文件
1 | from modules.test import t1.py |
5.文件 main.py 导入包含多级目录 modules 目录下的 t1.py 文件的 t12函数(假设有个t12函数)
1 | from modules.test.t1 import t12 |
二、引入上层一目录下的文件
1. 假设:
/home/ubu/py_test/main.py 因为某个需求,换了路径 /home/ubu/py_test/bin/main.py 多个一层bin
如果想使用上一级的 py_test 目录下 con.py ( 绝对路径:/home/ubu/py_test/con.py )
因为, 运行 main.py 脚本默认只会添加 main.py 所在的绝对路径,而 con.py 所在的 /home/ubu/py_test/ 路径不会给添加,所以就要手动添加了。
1 2 3 | import os,sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import con |
因为找到了 py_test 路径, con.py自然也能找到,导入也就没有问题了
os.path.abspath(__file__) 是获取当前的文件名绝对路径(/home/ubu/py_test/bin/main.py )
os.path.dirname 获取路径部分(/home/ubu/py_test/bin/),相当于 cd ../
os.path.dirname 再来一次,又获取上一层路径(/home/ubu/py_test/),相当于 cd ../
sys.path.append 将 /home/ubu/py_test/ 路径添加到 python 路径列表中,就可以导入 con 模块
2. from 上一级相对路径导入(一般不推荐使用,了解即可)来源
假设:
/home/ubu/py_test/modules/test/t1.py 文件要导入 /home/ubu/py_test/modules/tt.py 文件
t1文件里如下写:
1 | from ..tt import f1 |
3.from 当前路径导入(一般不推荐使用,了解即可)来源
假设:
/home/ubu/py_test/modules/test/t1.py 文件要导入 /home/ubu/py_test/modules/test/t2.py 文件
t1文件里如下写:
1 | from . import t2 |
三、引入指定路径下的包
默认情况下,python 会有两个路径列表,1. main.py 所在的当前路径;2. python 安装路径
1. 查看python里路径列表
1 2 | import sys print (sys.path) |
2.添加指定路径,其他项目路径
1 2 | import sys sys.path.append(r "/home/ubu/m2c/" ) |
此时,home/ubu/m2c/ 这个路径添加到了列表结尾
3.将指定路径插入到最前面
1 2 | import sys sys.path.insert( 1 ,r "/home/ubu/m2c/" ) |
insert 需要两个参数:
第一个,是插入列表的位置下表数(列表下标是 0 开始的,这里是1,插入到第二位置);
第二个,是就是插入的自定义路径
为什么是1 不是0位置呢? 答:是因为默认,0位置一般是 main.py 所在路径,寻找模块时优先脚本当前目录下查找。
三、使用模块的优先级
在 python 维护的路径中,使用最先找到的那个模块使用。
假设,python 自带了 re 模块,而 main.py 下也有个 re.py,那么 main.py 将优先加载 当前目录下的 re.py 文件
注意:起文件名,尽量不要系统自带的名字重复,否则在运行过程中会有意想不到的结果,也给调试带来麻烦。
四、导入函数优先级
1.假设:
modules/tt.py 和 con.py 两个文件里都有个 f1() 的函数。
那么会使用谁的 f1() 函数?
写法一:
1 2 | from modules import tt import con |
这样写将使用 con 里的 f1 函数
写法二:
1 2 | import con.py from modules import tt |
这样写将使用 tt 里的 f1 函数
总结:就是谁在最后使用谁的 f1()函数
2. 用 as 给函数起别名:
如果是自己写的内容,就应该避免相同的函数名,但是如果是别人写的项目,我们也不能修改,那就给 f1 函数起别名, as(别名) 。
1 2 | import con.py as con_fi from modules import tt as tt_f1 |
这样用 con_fi 就是用 con里的 fi 函数; 用 tt_f1 就是用 tt 里的 f1函数。也就不存在谁覆盖谁,谁在前谁在后了。
-
来源:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)