You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:24