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函数。也就不存在谁覆盖谁,谁在前谁在后了。

 

 

 

 

-

来源:

https://www.bilibili.com/video/BV1V84y1r77S

posted @   悟透  阅读(1498)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示