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

跨目录调用Python脚本遇模块找不到问题及函数追踪需求

解决跨目录调用driver.py时的模块导入错误问题

我明白你的问题了:直接在driver.py所在的目录运行它一切正常,但通过其他目录的脚本加载并运行它时,driver.py里的import car, vehicles, transport会抛出“模块找不到”的错误,而且你不能修改driver.py的代码。

问题根源

当你直接在driver.py的目录下运行它时,Python会自动把当前工作目录(也就是driver.py所在的目录)添加到sys.path中——这是Python查找模块的路径列表。所以import car能轻松找到同目录下的car.py。

但当你通过importlib从其他目录加载driver.py时,当前工作目录是你的脚本A/B所在的目录,driver.py的目录并没有被加入sys.path,所以Python找不到那些同目录的模块,自然报错。

解决方案(无需修改driver.py)

我们可以在加载driver.py模块之前,临时把它所在的目录添加到sys.path中,让Python能找到它依赖的同目录模块。修改你的脚本B(generate_sequence_diagram.py)代码如下:

from trace import Trace
import importlib
import os
import sys  # 新增导入sys模块

class GenerateSequenceDiagram:
    def __init__(self, driver_module_path):
        print('inside init of gen seq diag, dir is: {}'.format(os.getcwd()))
        # 获取driver.py所在的绝对目录路径
        self.driver_dir = os.path.dirname(os.path.abspath(driver_module_path))
        
        self.driver_module_spec = importlib.util.spec_from_file_location('driver', driver_module_path)
        self.driver_module = importlib.util.module_from_spec(self.driver_module_spec)

    def get_called_functions(self, driver_function):
        # 保存原始sys.path,避免影响其他代码(可选但推荐)
        original_sys_path = sys.path.copy()
        try:
            # 将driver所在目录加入sys.path头部,确保优先查找
            sys.path.insert(0, self.driver_dir)
            # 加载driver模块,此时它的import语句能找到同目录模块
            self.driver_module_spec.loader.exec_module(self.driver_module)
            self.driver_function = getattr(self.driver_module, driver_function)
            
            # 执行追踪逻辑
            tracer = Trace(countfuncs=1)
            tracer.run('{}()'.format(self.driver_function.__name__))
            results = tracer.results()
            called_functions = results.calledfuncs
        finally:
            # 恢复原始sys.path,避免污染全局环境
            sys.path = original_sys_path
        return called_functions

为什么这个方案有效

  • 我们通过os.path.dirname(os.path.abspath(driver_module_path))精准获取到driver.py的所在目录,不管你的脚本A/B在哪个位置运行,这个路径都是正确的。
  • 临时将该目录加入sys.path,模拟了直接在driver.py目录运行时的Python环境,让driver.py里的import语句能正常找到依赖模块。
  • 用try...finally恢复sys.path,避免修改全局路径影响其他代码的模块查找。

额外注意点

确保你在脚本A中调用时传入的是driver.py的绝对路径(就像你现在做的那样),这样os.path.abspath才能正确解析目录。

内容的提问来源于stack exchange,提问作者Aviral Srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:27:29