使用 pyximport reload_support 重新加载 Cython 不起作用

Posted

技术标签:

【中文标题】使用 pyximport reload_support 重新加载 Cython 不起作用【英文标题】:Cython reload with pyximport reload_support not working 【发布时间】:2021-11-20 03:12:48 【问题描述】:

关于在 IPython 中重新加载 Cython 文件有很多问题(我使用的是 Spyder)。这是我的实现,似乎检查了其他问题的所有框:

from importlib import reload
import pyximport
import sys
pyximport.install(reload_support=True)

try:
    del sys.modules['cython_test.ctest']
    del ctest
except:
    pass

import cython_test.ctest as ctest
ctest = reload(ctest)

ctest.test()

但是,它不起作用,我必须重新启动内核才能获取文件的更新版本。

如果相关,下面是我生成 .so 文件的方式:

from setuptools import setup
from Cython.Build import cythonize
import os

file = os.environ.get("CYTHONIZE_FILE", "")
setup(ext_modules=cythonize(f"file.pyx"))

我会在命令行中调用它:

CYTHONIZE_FILE=ctest python setup.py build_ext --inplace

有什么想法吗?

【问题讨论】:

重新加载后需要再次导入。有关说明,请参阅***.com/a/55172547/5769463 该解释暗示了问题所在。看我的回答。那么.so 文件只需要在命令行中运行吗?关于为什么一种方式在 IPython 中有效而另一种方式在终端中有效的任何解释? 如果您自己生成so-file,您不应该使用pyximport(它在缓存中生成扩展,即我们的位置)作为其动态构建扩展的目的。 【参考方案1】:

问题显然在于构建文件和创建.so 文件。如果我根本不这样做(即完全删除.so 文件并重新启动内核),我的代码可以工作。

【讨论】:

以上是关于使用 pyximport reload_support 重新加载 Cython 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyximport 时如何设置 Cython 编译器标志?

使用 pyximport reload_support 重新加载 Cython 不起作用

爬取猫眼数据

cx_Freeze 无法包含 Cython .pyx 模块

如何替换已弃用的 imp.load_dynamic 的用法?

测试使用