gpt4 book ai didi

python - 使用 pyximport 重新加载模块?

转载 作者:太空狗 更新时间:2023-10-30 02:36:17 28 4
gpt4 key购买 nike

我有一个 python 程序,它在运行前加载了相当多的数据。因此,我希望能够在不重新加载数据的情况下重新加载代码。使用常规 python,importlib.reload 一直运行良好。这是一个例子:

设置.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [
Extension("foo.bar", ["foo/bar.pyx"],
language="c++",
extra_compile_args=["-std=c++11"],
extra_link_args=["-std=c++11"])
]
setup(
name="system2",
ext_modules=cythonize(extensions, compiler_directives={'language_level' : "3"}),
)

foo/bar.py

cpdef say_hello():
print('Hello!')

运行者.py:

import pyximport
pyximport.install(reload_support=True)

import foo.bar
import subprocess
from importlib import reload

if __name__ == '__main__':

def reload_bar():
p = subprocess.Popen('python setup.py build_ext --inplace',
shell=True,
cwd='<your directory>')
p.wait()

reload(foo.bar)
foo.bar.say_hello()

但这似乎行不通。如果我编辑 bar.pyx 并运行 reload_bar 我看不到我的更改。我也试过 pyximport.build_module() 但没有成功——模块重建但没有重新加载。我在“普通”python shell 中运行,而不是 IPython,如果它有所不同的话。

最佳答案

与 Python 3.x 相比,我能够更轻松地获得适用于 Python 2.x 的解决方案。无论出于何种原因,Cython 似乎正在缓存它从中导入模块的可共享对象 (.so) 文件,即使在运行时重建和删除旧文件后,它仍然从旧的可共享对象导入文件。然而,这无论如何都不是必需的(当您import foo.bar 时,它不会创建一个),所以我们可以跳过它。

最大的问题是 python 保留了对旧模块的引用,即使在 reloading 之后也是如此。普通的 python 模块似乎可以找到,但与 cython 无关。为了解决这个问题,我运行了两个语句来代替 reload(foo.bar)

del sys.modules['foo.bar']
import foo.bar

这成功地(尽管效率可能较低)重新加载了 cython 模块。运行该子进程的 Python 3.x 中唯一存在的问题是创建有问题的可共享对象。相反,一起跳过这些,让 import foo.barpyximporter 模块一起发挥它的魔力,然后为您重新编译。我还在 pyxinstall 命令中添加了一个选项来指定语言级别以匹配您在 setup.py

中指定的内容
pyximport.install(reload_support=True, language_level=3)

所以一起:

runner.py

import sys
import pyximport
pyximport.install(reload_support=True, language_level=3)

import foo.bar

if __name__ == '__main__':
def reload_bar():
del sys.modules['foo.bar']
import foo.bar

foo.bar.say_hello()
input(" press enter to proceed ")
reload_bar()
foo.bar.say_hello()

其他两个文件保持不变

运行:

Hello!
press enter to proceed

-将 foo/bar.pyx 中的 "Hello!" 替换为 "Hello world!",然后按 Enter.

Hello world!

关于python - 使用 pyximport 重新加载模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056563/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com