跨目录import包的问题又来了!!!!!之前是直接将要调用的py文件的绝对路径append,但是项目要经常迁移到各种平台,将路径写死了很不方便。
import sys
sys.path.append('C:\Users\KerryChen\Desktop\PsyDrugKB\')
from utils.dbutils import DBconnection
得改成相对路径,如下图所示我要在transporter.py里调用utils文件夹里的dbutils.py
直接调用发现,报了如下错误——没有'utils.dbutils'的模块。
/home/cqfnenu/PsyDrugKB
Traceback (most recent call last):
File "/home/cqfnenu/PsyDrugKB/transporter/transporter.py", line 20, in <module>
from utils.dbutils import DBconnection
ModuleNotFoundError: No module named 'utils.dbutils'
通过查阅各种博客发现添加如下的代码总算是解决了该报错。
import importlib, sys
importlib.reload(sys)
sys.path.append(os.path.abspath(__file__).rsplit('/', 2)[0])
from utils.dbutils import DBconnection
最后总结一下,在跨目录调包的时候,我们要知道如何获取当前脚本文件的相对路径和绝对路径。
import os,sys
print(__file__) # 获取transporter.py的相对路径
print(os.path.abspath(__file__)) # 获取transporter.py的绝对路径
print(os.path.dirname(os.path.abspath(__file__))) # 获取transporter文件夹的绝对路径
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 获得的是PsyDrugKB文件夹的绝对路径
# 添加环境变量,因为append是从列表最后开始添加路径,可能前面路径有重复,最好用sys.path.insert(Base_DIR)从列表最前面开始添加
Base_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(Base_DIR)
from utils.dbutils import DBconnection