使用 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 不起作用