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

调试SOMPY库时仅显示Python字节码,修改代码未生效

问题:SOMPY库修改后未生效,调试时出现陌生格式代码

问题描述

我正在用Python的SOMPY库构建自组织映射(SOM),为实现最佳匹配单元(BMU)的替代计算方法,修改了原库代码,但发现修改完全没生效。

为排查原因,我尝试调试进入SOMFactory.build()方法,最小复现代码如下:

import sompy 
import numpy as np 

test = sompy.SOMFactory.build(np.ones((20, 3)))

我预期调试时会进入自己修改过的SOMFactory类定义代码:

class SOMFactory(object):

    @staticmethod
    def build(data,
              mapsize=None,
              mask=None,
              mapshape='planar',
              lattice='rect',
              normalization='var',
              initialization='pca',
              neighborhood='gaussian',
              training='batch',
              name='sompy',
              component_names=None):
        """
        :param data: data to be clustered, represented as a matrix of n rows,
            as inputs and m cols as input features
        :param neighborhood: neighborhood object calculator.  Options are:
            - gaussian
            - bubble
            - manhattan (not implemented yet)
            - cut_gaussian (not implemented yet)
            - epanechicov (not implemented yet)

        :param normalization: normalizer object calculator. Options are:
            - var

        :param mapsize: tuple/list defining the dimensions of the som.
            If single number is provided is considered as the number of nodes.
        :param mask: mask
        :param mapshape: shape of the som. Options are:
            - planar
            - toroid (not implemented yet)
            - cylinder (not implemented yet)

        :param lattice: type of lattice. Options are:
            - rect
            - hexa

        :param initialization: method to be used for initialization of the som.
            Options are:
            - pca
            - random

        :param name: name used to identify the som
        :param training: Training mode (seq, batch)
        """
        
        print("I am in the function! ")
        
        if normalization:
            normalizer = NormalizerFactory.build(normalization)
        else:
            normalizer = None
        neighborhood_calculator = NeighborhoodFactory.build(neighborhood)
        return SOM(data, neighborhood_calculator, normalizer, mapsize, mask,
                   mapshape, lattice, initialization, training, name, component_names)

但实际调试时进入的是名为sompy.py的文件,里面是完全陌生的代码格式:

LOAD_FAST(normalization), POP_JUMP_IF_FALSE{16}
LOAD_GLOBAL(NormalizerFactory), LOAD_METHOD(build), LOAD_FAST(normalization), CALL_METHOD{1}, STORE_FAST(normalizer), JUMP_FORWARD(to 20)

normalizer = |16|None
LOAD_GLOBAL(NeighborhoodFactory), LOAD_METHOD(build), LOAD_FAST(neighborhood), CALL_METHOD{1}, STORE_FAST(neighborhood_calculator)
return SOM(data, neighborhood_calculator, normalizer, mapsize, mask, 
mapshape, lattice, initialization, training, name, component_names)

我想知道:

  1. 这种陌生格式的代码是什么?
  2. 如何让我对SOMFactory类的修改真正生效?

解答

1. 陌生代码的本质

这是Python字节码的反编译结果。当Python代码被编译成.pyc或.pyo字节码文件后,若调试器找不到对应的原始.py源文件,就会自动反编译字节码为这种近似伪代码的格式来展示执行逻辑。这说明你的调试器没有加载到你修改过的.py源文件,反而加载了预编译的字节码。

2. 修改未生效的原因及解决方法

核心原因

你修改的源文件和Python实际加载的SOMPY库文件不是同一个,或者Python优先使用了旧的预编译字节码。

解决步骤

  • 确认Python加载的SOMPY路径:在代码中添加以下语句,查看实际导入的库位置:

    import sompy
    print(sompy.__file__)
    

    输出的路径就是Python实际使用的SOMPY文件位置,你需要修改这个路径下的文件,而非本地克隆的其他副本。

  • 删除预编译字节码:找到SOMPY库所在目录,删除所有.pyc文件或__pycache__文件夹,确保Python重新编译修改后的源文件。

  • 使用开发模式安装库:若你是从源码修改,推荐用pip install -e .在开发模式下安装SOMPY,这样Python会直接加载你本地修改的源码,而非复制到site-packages目录。

  • 重启调试器/解释器:修改代码后必须重启当前的Python解释器或调试会话,否则会继续使用内存中加载的旧代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:48:28