如何为* .pyd / * .dll文件挂钩/重定向import语句? (zip嵌入式python)

时间:2017-10-23 16:05:17

标签: python c++ dll

我正在尝试在我的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())

0 个答案:

没有答案