今天我想要导入本地当前目录下的文件和父目录下的文件,网上查了很多教程,但还都是报错,最后几经尝试,终于成功解决了这一问题,在这里详细记录一下过程,同时也希望能够对大家有所帮助~~~:)
导入当前目录下的文件
需求:在DataManager.py中导入tokenizer包下的文件(如下图目录结构所示)
分析可知,这显然属于是导入当前目录下的文件,
但是,使用import直接导入(具体如下一行代码所示)就是会报错:找不到模块tokenizer。
from tokenizer.LMTextTokenizer import LMTextTokenizer
先说结果,最后成功的办法:
将上一行代码修改成:
from .tokenizer.LMTextTokenizer import LMTextTokenizer
对,你没有看错,就是在tokenizer的前面加一个点,无敌简单的方法,或许有时候简单的反而更有效【笑哭】【笑哭】【笑哭】
然后解释下原因:
“.”表示当前目录,所以就是在当前目录下的tokenizer包下的LMTextTokenizer中导入LMTextTokenizer。
吐槽一下:
之前尝试过把路径“./tokenizer”放到os.path中,如果目录存在则导入,否则给出提示信息。这个方法一开始修改之后确实可以成功导入,但是我之后再改完别的import语句后运行就又导入不了了,所以还是不行。
至于其它试过的办法,压根就没成功过一次,根本不值一提,这里就不再赘述了。
导入父目录下的文件
需求:在DataManager.py中导入utils包下的文件
分析可知,这显然是导入父目录下的文件,
但是用from...import导入就是会报错:模块找不到
from utils.IOOption import open_file, write_file
先说结果,最后成功的办法:
将上一行代码修改成:
import os
import sys
sys.path.insert(0,os.path.dirname(os.getcwd()))
from utils.IOOption import open_file, write_file
就可以成功导入了。
原因解释:
首先利用sys.path.insert将当前目录插入到pycharm查找模块的路径中的第一条,这样就可以顺利找到utils下的模块了。
总之,bug是千奇百怪,防不胜防,但好在最终解决了【嘻嘻】