如何从pythonscript.py调用子子文件夹中main.py的get_version函数?
解决Python插件脚本导入第三方模块的问题
场景说明
目录结构如下:
repo/ ├─ third_party/ │ ├─ project/ │ │ ├─ src/ │ │ │ ├─ moduledir/ │ │ │ │ ├─ __init__.py │ │ │ │ ├─ main.py ├─ pythonscript.py
main.py中包含测试函数:
def get_version(): return "1.0"
需要在pythonscript.py中调用get_version()函数,注意仅moduledir是包含空__init__.py的合法包,上层的third_party/project/src不属于模块/包。此外,该脚本是由工具执行的插件文件,不会直接运行。
错误尝试与报错
使用以下代码尝试导入函数,但导入失败:
sys.path.append(os.path.join(os.path.dirname(__file__), 'third_party/project/src/moduledir')) from main import get_version
报错信息:
ERROR: Error loading pythonscript at '/home/user/dev/Product/pythonscript.py': Unable to load pythonscript in /home/user/dev/Product/pythonscript.py ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/anaconda3/envs/meteomatics/lib/python3.11/imp.py", line 172, in load_source module = _load(spec) ^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 721, in _load File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 940, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/user/dev/Product/pythonscript.py", line 13, in <module> from main import get_version ModuleNotFoundError: No module named 'main'
问题原因
你错误地将moduledir目录添加到了sys.path中,但main.py是moduledir包内的模块。Python要识别moduledir为可导入的包,需要将它的父目录third_party/project/src加入sys.path,而非moduledir本身。
解决方法
方法一:规范包导入(推荐)
调整sys.path指向src目录,通过包名正常导入模块:
import os import sys # 获取src目录的绝对路径并加入sys.path src_path = os.path.join(os.path.dirname(__file__), "third_party", "project", "src") sys.path.append(src_path) # 从moduledir包的main模块导入目标函数 from moduledir.main import get_version
方法二:直接加载模块文件
如果不想调整路径到src,可以使用importlib直接加载指定的main.py文件:
import os import importlib.util # 拼接main.py的绝对路径 main_file_path = os.path.join(os.path.dirname(__file__), "third_party", "project", "src", "moduledir", "main.py") # 加载目标模块 spec = importlib.util.spec_from_file_location("main_module", main_file_path) main_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(main_module) # 调用目标函数 version = main_module.get_version()
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

