我正在尝试在我的C ++应用程序中嵌入python。
为方便起见,我想将所有模块(Lib
文件夹)放在一个zip文件中。
但是,某些模块依赖于无法从内存加载的*pyd
和.dll
文件(因为Windows无法从内存加载dll)。
ZipExtImporter package *似乎通过the memory module(信用Joachim Bauch)在内存中加载本机组件来绕过这个问题。
(另见:load pyd files from a zip from embedded python)
但是,我不想从内存加载,因为在32位计算机上,调用进程的虚拟地址空间可能会受到限制。
然后我想知道是否有办法将对这些本机组件的调用重定向到包含所有*.dll/*.pyd
的文件夹。
我们的想法是在压缩Lib文件夹之前提取所有.pyd/dlls
,将它们放入公共文件夹并将import语句重定向到此外部文件夹。
我相信这可以通过sys.meta_path完成,但我没有成功。
*此包不再维护。
所以我的问题是:
如何将调用重定向到我移动到zip文件之外的' .pyd / .dll'文件(不修改模块的源代码)?
编辑:为了让您了解我正在尝试做什么,请参阅下面的代码,该代码应该将导入语句捕获到特定的pyd文件并将其重定向到其他位置。在这个阶段我只试过一个非压缩文件夹,但它不起作用......
# just test for a single pyd file that I removed from a non-zipped folder
class CustomImporter(object):
virtual_name = 'pandas._libs.tslib' # a pyd file
def find_module(self, fullname, path=None):
if fullname == self.virtual_name:
return self
return None
def load_module(self, fullname):
if fullname in sys.modules:
return sys.modules[fullname]
if fullname != self.virtual_name:
raise ImportError(fullname)
try:
path = r"C:\.....\tslib.cp35-win_amd64.pyd"
module = imp.load_dynamic("tslib",path )
module.__file__ = path
module.__loader__ = self
module.__name__ = self.virtual_name
sys.modules[self.virtual_name] = module
except BaseException as e:
raise ImportError(fullname + str(e))
return module
并附上如下:
sys.meta_path.append(CustomImporter())