【问题标题】:Cython reload with pyximport reload_support not working使用 pyximport reload_support 重新加载 Cython 不起作用
【发布时间】: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

有什么想法吗?

【问题讨论】:

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

标签: python ipython cython spyder


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 2023-03-21
    • 1970-01-01
    • 2017-12-29
    • 2012-05-31
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多