调试SOMPY库时仅显示Python字节码,修改代码未生效
问题描述
我正在用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)
我想知道:
- 这种陌生格式的代码是什么?
- 如何让我对
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

