我有以下文件层次结构:
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(), "."])])
你正在建造几何.pyx作为顶级模块,而实际上它是}),pickler在试图找到名为
geometrylib
包的一部分。结果,Camera
类分配了不正确的__module__
值(geometry
而不是{geometry
的顶层模块时失败。在你应该遵循标准的包装指南,即设置.py进入“Python”文件夹,在顶层模块(geometrylib)旁边。安装调用如下所示:
相关问题 更多 >
编程相关推荐