早期就发现了Python这东西跟Java在导包方面,路径是有很大差异的,但是今天才发现差异原来那么大,下面进行整体的Python导包路径汇总
首先,最重要的一点,导包不要用 * ,不要用 * ,不要用 * !!!!!!
其次,如果一个文件 a 引入了文件 c 的路径,同时这个文件 a 还要被别的文件 b 引用,那么文件a中所引入的文件 c 的路径最好采用函数变为绝对路径!!!!!!!
例子:
- main.py
- model
Model.py
Train.py
- utils
Load_Data.py
test.py
dataset
data.json
解释:
1、 Python的x瘫导包机制,导致文件路径会从你当前运行文件的这个路径开始计算,例如Model.py中,有一个xx函数,里面调用了 '../utils/test.py',同时如果main函数采用from utils.Model import *这种方式,那么在main中使用xx函数,就会从main函数这个根路径,再进行返回上一级寻找test.py文件,而不是从Model函数来返回上一级寻找
2、假如Load_Data.py函数用'dataset/data.json'来使用了json的数据,那么如果Train.py引入了Load_Data(不管以什么方式),那么就会从Train.py这个文件为根路径,寻找dataset文件夹,这样也会引发报错
解决方式:
1、导包采用正确的导包方式,在model下的文件,不需要返回上一级,可以直接导utils下的包,如Model.py中可以直接from utils import Load_Data
2、在涉及一些数据文件路径的时候,如果使用数据文件的这个py文件要被别人引用,那么所有偶的数据文件路径均需要采用绝对路径来表示,如下面Load_Data.py中的代码所示:
import os
current_dir = os.path.dirname(__file__) # 获取当前文件的绝对路径
GPT_File = os.path.join(current_dir, 'dataset', 'data.json') # 拼接字符串,采用绝对路径来进行地址映射
这样可以确保你的所有文件的路径都是正确的