Python嵌套模块导入冲突:子模块同时支持独立运行与被调用的导入方案
Python嵌套模块双场景导入解决方案
问题根源
Python运行脚本时会将执行入口脚本所在的目录加入模块搜索路径sys.path的最高优先级,而非以模块文件本身所在目录为基准,因此会出现两种运行场景下路径不兼容的问题。
前置修复
当前运行Generator.py抛出ModuleNotFoundError: No module named 'Function1',是因为Function1存放在modules子目录下,不能直接导入,先修改Generator.py的导入逻辑:
# Generator.py from modules import Function1 # 原代码缺少括号,是打印函数对象而非执行结果,需要补括号 print(Function1.Function1_return())
双场景兼容解决方案
两种方案都可以实现Function1同时支持独立运行、作为模块被导入的需求:
方案1:动态添加模块搜索路径(更推荐,无冗余逻辑)
在Function1.py开头添加代码,将自身所在目录强制加入sys.path,不管从哪个入口运行都能正确识别同目录下的Subfunction:
# Function1.py import sys from pathlib import Path # 将当前文件所在目录加入模块搜索路径 sys.path.append(str(Path(__file__).parent.resolve())) import Subfunction def Function1_return(): return Subfunction.Subfunction_return() if __name__ == '__main__': print(Function1_return())
Subfunction.py无需做任何修改。
方案2:try-except捕获导入错误兼容
不需要修改搜索路径,直接在Function1.py中写适配两种场景的导入逻辑即可:
# Function1.py try: # 作为Generator子模块导入的场景 from modules import Subfunction except ImportError: # 独立运行的场景 import Subfunction def Function1_return(): return Subfunction.Subfunction_return() if __name__ == '__main__': print(Function1_return())
相对导入失效说明
你尝试的以.开头的相对导入语法,仅支持文件作为包的一部分被导入的场景。当你直接运行Function1.py作为入口时,Python会将其标记为__main__模块,不再识别为modules包的子模块,因此相对导入会直接报错。
内容的提问来源于stack exchange,提问作者Zdunkov
相关产品推荐
相关产品推荐

