Python跨目录导入模块时免修改子模块导入路径的方案
可行方案
无需修改b.py及folder1目录下任何文件的导入语句,仅需在a.ipynb最顶部、所有导入folder1相关模块的代码之前,添加以下3行代码即可:
import sys import os sys.path.insert(0, os.path.abspath("./folder1"))
原理说明
Python执行导入操作时,会严格按照sys.path列表中存储的路径顺序查找目标模块:
- 上述代码将
folder1的绝对路径插入到模块搜索路径的最高优先级位置 - 当
b.py执行from c import something时,Python会优先进入folder1目录查找,直接匹配到同目录下的c.py - 当
b.py执行from folder2.d import something时,同样会在folder1目录下找到folder2子目录,进而定位到d.py - 该操作本质是还原了目录调整前,
b.py视角下的模块搜索环境,和之前a、b同目录时的导入逻辑完全一致
注意事项
只要a.ipynb所在的根目录下不存在和
c.py、folder2重名的文件/文件夹,该方案就不会出现导入冲突。如果存在重名,因为我们用insert(0)把folder1路径放到了搜索列表最前面,Python也会优先加载folder1下的对应文件,不会影响原有逻辑。如果运行Notebook时手动切换过工作目录,把代码里的
"./folder1"替换成folder1文件夹在你设备上的实际绝对路径即可。
内容的提问来源于stack exchange,提问作者bunNyBug
相关产品推荐
相关产品推荐

