在Python 2.7中安全卸载/重新加载C ++ dll(用新版本替换dll)

时间:2018-09-20 14:58:36

标签: python c++ windows

我问这个问题的背景是,该主题的其他大多数问题都在5-10岁之内,并给出以下内容

  • Windows 7操作系统
  • .pyd个已编译dll的多个版本,位于不同的文件路径位置,例如
    • /ver1.0/lib/my_dll.pyd
    • /ver1.1/lib/my_dll.pyd
  • my_dll.pyd是从辅助文件中以from my_dll import *的形式导入的,我无法控制该方法,也不能随意更改

我可以按照以下说明在两个.pyd版本之间成功切换

import sys
sys.path.append(r'\path\to\ver_1.0')
import my_dll                    # imports ver 1.0
print my_dll.release_version()
sys.path.pop(-1)
del sys.modules['my_dll']        # remove module dict ref
from IPython import get_ipython  # just in case you run in iPython
get_ipython().magic('reset -sf') # need to remove history!
del my_dll                       # delete the import object

import _ctypes                   # release the library handle
import ctypes
dll = ctypes.CDLL('my_dll.pyd')
_ctypes.FreeLibrary(dll._handle) # for some reason it needs to be
_ctypes.FreeLibrary(dll._handle) # done twice.

sys.path.append(r'\path\to\ver_1.1')
import my_dll
print my_dll.release_version()

根据以下输出,通过重新加载C ++ reload来克服.pyd的失败

Version 1.0
Version 1.1

我的问题是,那时我剩下了一个极其脆弱的python生态系统,它将在几乎所有新函数调用时崩溃。

是否有更新的方法?

参考

0 个答案:

没有答案