gpt4 book ai didi

python - 在执行 Python 脚本时替换 Python 扩展模块时出现问题

转载 作者:行者123 更新时间:2023-11-28 17:54:26 24 4
gpt4 key购买 nike

我正在尝试解决以下问题:假设我有一个 Python 脚本(我们称它为 Test.py),它使用 C++ 扩展模块(通过 SWIG 制作,我们称该模块为“Example”)。我在同一目录中有 Test.py、Example.py 和 _Example.so。

现在,在运行 Test.py 的过程中,我想更改我的示例模块,重新编译(这将覆盖现有的 .so),并使用命令正常停止仍在使用的 Test.py模块的旧版本(Test.py 有一些清理工作要做,它使用了一些在 Example 模块中定义的东西),然后使用新版本的模块再次启动它。在我的情况下,优雅地停止 Test.py 然后重新编译模块不是一个选项。

问题是,一旦 _Example.so 被覆盖并且 Test.py 尝试访问 Example 模块中定义的任何内容(同时优雅地停止),我就会遇到段错误。一种解决方案是通过在末尾附加版本号来显式命名 Example 模块,但我想知道是否有更好的解决方案(我不想导入 Example_1_0)?

最佳答案

您可以在启动 Test.py 时,将 Example.* 文件复制到该实例唯一的临时文件夹(查看 tempfile.mkdtemp,它可以创建安全、唯一的文件夹) ,将其添加到 sys.path 然后导入 Example;并在 Test.py 关闭时在清理阶段删除该文件夹 (shutils.rmtree)。

这意味着 Test.py 的每个实例都将在其自己的 Example 模块副本上运行,不会干扰其他实例,并且只会在重新启动时更新到新实例。

为此,您需要 Example.* 文件不要与 Test.py 位于同一文件夹中,否则导入将首先获取这些文件。只需将它们存储在子文件夹中就可以了。

关于python - 在执行 Python 脚本时替换 Python 扩展模块时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018122/

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