当pickle一个类时,我在python中得到的行为与在cython中不同

2024-09-30 20:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下文件层次结构:

python/apps/A.py
      /geometrylib/__init__.py
      /geometrylib/B.py
      /geometrylib/geometry.py
      /geometrylib/goemetry.pyx
      /geometrylib/goemetry.pyd

在几何.pyx以及几何.py包含相同的类Camera(cython版本用cdef定义类)。A.py和B.py都会导入几何体模块。在

如果我导入cython版本(编译为几何.pyd),我可以从python/geometrylib文件夹中的B.py中正确地pickle Camera。但我无法从python/apps文件夹中的A.py中pickle Camera,我得到以下异常:

在pickle.pickling错误:无法腌制:未找到几何学。照相机在

但是,如果我删除几何.pyd我导入python版本(几何.py)相反,我可以从A.py或B.py中提取相机。除了删除,没有其他更改几何.pyd,相同的python命令行,在这两种情况下从同一个文件夹运行。 为什么会有这种区别?

仔细研究一下,我发现异常发生在C:\Python27\Lib中\泡菜.py742号线

^{pr2}$

在A.py中,我导入cython版本(几何.pyd),模块是“geometry”,并且__import__(module)触发异常。在A.py中,我导入python版本(几何.py),(并且我pickle一个Camera实例来触发预期)模块是“几何几何”和__import__(module)正确导入模块。在

我通过将python/geometrylib添加到PYTHONPATH中解决了这个问题,然后我可以使用cython版本从A.py和B.py中正确地pickle摄影机。在

这是怎么工作的?我不喜欢我的解决方案。有人有更好的解决方案吗?

编辑以添加一些额外的信息。在

另外,根据要求,这是设置.py我以前做过cython扩展。在

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy

setup(
    cmdclass = { 'build_ext': build_ext},
    ext_modules = [Extension("geometry", ['geometry.pyx'], include_dirs=[numpy.get_include(), "."])])

Tags: 模块frompyimportbuild版本文件夹ext
1条回答
网友
1楼 · 发布于 2024-09-30 20:35:57

你正在建造几何.pyx作为顶级模块,而实际上它是geometrylib包的一部分。结果,Camera类分配了不正确的__module__值(geometry而不是{}),pickler在试图找到名为geometry的顶层模块时失败。在

你应该遵循标准的包装指南,即设置.py进入“Python”文件夹,在顶层模块(geometrylib)旁边。安装调用如下所示:

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("geometrylib.geometry", ['geometrylib/geometry.pyx'], include_dirs=[numpy.get_include(), "."])])

相关问题 更多 >