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
加载说明:
python 找一个模块,是通过搜索 “sys.path” 变量里路径,来找到对应模块的。
那么,指定自定义模块,就是给 sys.path 增加自定义模块路径即可。
使用 下面命令,可以查看模块路径是否存在
print("sys.path=", sys.path)
一、 引入模块文件及子目录模块文件
1.主文件 main.py 导入 同目录下的 con.py 文件
import con.py
2.文件 main.py 导入 modules 目录下的 tt.py 文件全部内容
from modules import tt
3. 文件 main.py 导入 modules 目录下的 tt.py 文件里的 test 函数(假设有个test函数)
from modules.tt import test
4. 文件 main.py 导入包含多级目录 modules 目录下的 t1.py 文件
from modules.test import t1.py
5.文件 main.py 导入包含多级目录 modules 目录下的 t1.py 文件的 t12函数(假设有个t12函数)
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/ 路径不会给添加,所以就要手动添加了。
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.py 文件要导入 tt.py 文件
t1文件里如下写:
from ..tt import f1
3.from 当前路径导入(一般不推荐使用,了解即可)来源
假设:
/home/ubu/py_test/modules/test/t1.py
/home/ubu/py_test/modules/test/t2.py
t1.py 文件要导入 t2.py 文件
t1文件里如下写:
from . import t2
三、引入指定路径下的包
默认情况下,python 会有两个路径列表,1. main.py 所在的当前路径;2. python 安装路径
1. 查看python里路径列表
import sys print(sys.path)
2.添加指定路径,其他项目路径
import sys sys.path.append(r"/home/ubu/m2c/")
此时,home/ubu/m2c/ 这个路径添加到了列表结尾
3.将指定路径插入到最前面
import sys sys.path.insert(1,r"/home/ubu/m2c/")
insert 需要两个参数:
第一个,是插入列表的位置下表数(列表下标是 0 开始的,这里是1,插入到第二位置);
第二个,是就是插入的自定义路径
为什么是1 不是0位置呢? 答:是因为默认,0位置一般是 main.py 所在路径,寻找模块时优先脚本当前目录下查找。
三、使用其他项目
主文件绝对路径: /home/ubu/py_test/main.py
其他项目绝对路径:/home/ubu/m2c/mm.py
假设,main.py 要加载 mm.py 这个模块
方式一:使用相对路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from m2c import mm
因为上面两个路径,有共同的父路径(/home/ubu),使用此方法可以。
如果,路径比较深,或者没有共同的父路径,那还是建议直接指定绝对路径,或将两个文件放到同项目下
os.path.dirname 作用上面介绍过,这里不再重复
方式二:使用绝对路径
import sys sys.path.append(r'D:\DrissionPage_get_url_core') ## Windows 路径写法 sys.path.append(r'/home/ubu/m2c') ## Linux 路径写法 from m2c import mm
另:多层路径
如果,其他项目绝对路径,又增加一层m3d:/home/ubu/m2c/m3d/mm.py 导入模块写法
from m2c.m3d import mm
四、使用模块的优先级
在 python 维护的路径中,使用最先找到的那个模块使用。
假设,python 自带了 re 模块,而 main.py 下也有个 re.py,那么 main.py 将优先加载 当前目录下的 re.py 文件
注意:起文件名,尽量不要系统自带的名字重复,否则在运行过程中会有意想不到的结果,也给调试带来麻烦。
五、导入函数优先级
1.假设:
modules/tt.py 和 con.py 两个文件里都有个 f1() 的函数。
那么会使用谁的 f1() 函数?
写法一:
from modules import tt import con
这样写将使用 con 里的 f1 函数
写法二:
import con.py from modules import tt
这样写将使用 tt 里的 f1 函数
总结:就是谁在最后使用谁的 f1()函数
2. 用 as 给函数起别名:
如果是自己写的内容,就应该避免相同的函数名,但是如果是别人写的项目,我们也不能修改,那就给 f1 函数起别名, as(别名) 。
import con.py as con_fi from modules import tt as tt_f1
这样用 con_fi 就是用 con里的 fi 函数; 用 tt_f1 就是用 tt 里的 f1函数。也就不存在谁覆盖谁,谁在前谁在后了。
-
来源:
浙公网安备 33010602011771号