从python加载dll

Posted

技术标签:

【中文标题】从python加载dll【英文标题】:load dll from python 【发布时间】:2008-10-21 05:57:08 【问题描述】:

我正在使用我找到的一些源代码构建一个 python 应用程序 Here

我已经通过搜索网络设法编译并修复了一些问题,但我被困在这一点上:

运行应用程序时会出现此消息。

alt text http://img511.imageshack.us/img511/4481/loadfr0.png

这个 python 应用程序,使用 swig 链接到 c/c++ 代码。

我有VC++2005 express edition,我用它和scons一起编译 和 Python 2.5(也尝试过 2.4)

试图加载的 dll 是“msvcr80.dll”,因为在消息之前是“msvcr80.dll”之前找不到或类似的东西,所以我得到它并将它放在 window32 文件夹中。

对于我在这里读到的内容: http://msdn.microsoft.com/en-us/library/ms235591(VS.80).aspx

解决方案是使用清单和 dll 文件运行 MT。我已经这样做了,但也没有用。

谁能指出正确的方向?

这是清单文件的内容:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

我现在要尝试 Python 2.6,我不太确定是否理解问题,但 Python 2.5 和 Python 2.5 .exe 在 .exe 文件中包含字符串“MSVCR71.dll”。但这可能无关紧要。

ps。如果一切都像 jar 文件一样简单:(

这是完整的堆栈跟踪

None
INFO:root:Skipping provider enso.platform.osx.
INFO:root:Skipping provider enso.platform.linux.
INFO:root:Added provider enso.platform.win32.
Traceback (most recent call last):
  File "scripts\run_enso.py", line 24, in <module>
    enso.run()
  File "C:\oreyes\apps\enso\enso-read-only\enso\__init__.py", line 40, in run
    from enso.events import EventManager
  File "C:\oreyes\apps\enso\enso-read-only\enso\events.py", line 60, in <module>
    from enso import input
  File "C:\oreyes\apps\enso\enso-read-only\enso\input\__init__.py", line 3, in <module>
    _input = enso.providers.getInterface( "input" )
  File "C:\oreyes\apps\enso\enso-read-only\enso\providers.py", line 137, in getInterface
    interface = provider.provideInterface( name )
  File "C:\oreyes\apps\enso\enso-read-only\enso\platform\win32\__init__.py", line 48, in provideInterface
    import enso.platform.win32.input
  File "C:\oreyes\apps\enso\enso-read-only\enso\platform\win32\input\__init__.py", line 3, in <module>
    from InputManager import *
  File "C:\oreyes\apps\enso\enso-read-only\enso\platform\win32\input\InputManager.py", line 7, in <module>
    import _InputManager
ImportError: DLL load failed: Error en una rutina de inicializaci¾n de biblioteca de vÝnculos dinßmicos (DLL).

【问题讨论】:

【参考方案1】:

查看您的更新,您似乎需要安装Pycairo,因为您缺少作为 Pycairo 一部分安装的 _cairo 模块。有关如何获取/安装 Windows 二进制文件的说明,请参阅 Pycairo downloads page。

【讨论】:

链接好像坏了【参考方案2】:

我已经能够通过使用 /LD 作为编译器标志来编译和运行 Enso。这动态链接到 MS Visual C++ 运行时,似乎可以让您在没有清单的情况下逃脱。

如果您使用的是 SCons,请在此处查看差异文件:http://paste2.org/p/69732

【讨论】:

嘿斯派克,我觉得我认识你:P 我一直在 Enso 组中追逐你的 cmets,但格式并没有太大帮助。是的,我按照那个链接完成了大部分工作,直到这里。 问题(我猜是因为这是我使用 C++ 的第二天)是 python2.5 和 VS C++ 2005 有不同的 vscrt(xx).dll 第一个使用 71 和前一个 80。所以现在我已经下载了python2.6和VS2008,它们都使用vscrt90.dll。但现在我有库存:ImportError: DLL load failed:.【参考方案3】:

您可能需要安装 VC++ 运行时可再发行组件。他们的链接是here。

【讨论】:

【参考方案4】:

更新 我已经下载了 python2.6 和 VS C++ express edition 2008 并且 msvcr80.dll 的问题已经消失(我假设是因为 Python 和 VSC++2008xe 使用 msvscr90.dll)

我已使用 /LD 进行编译,所有更改都在此处列出:http://paste2.org/p/69732

现在问题来了:

INFO:root:Skipping provider enso.platform.osx.
INFO:root:Skipping provider enso.platform.linux.
INFO:root:Added provider enso.platform.win32.
INFO:root:Obtained interface 'input' from provider 'enso.platform.win32'.
Traceback (most recent call last):
  File "scripts\run_enso.py", line 23, in <module>
    enso.run()
  File "C:\oreyes\apps\enso\enso-comunity\enso\__init__.py", line 41, in run
    from enso.quasimode import Quasimode
  File "C:\oreyes\apps\enso\enso-comunity\enso\quasimode\__init__.py", line 62, in <module>
    from enso.quasimode.window import TheQuasimodeWindow
  File "C:\oreyes\apps\enso\enso-comunity\enso\quasimode\window.py", line 65, in <module>
    from enso.quasimode.linewindows import TextWindow
  File "C:\oreyes\apps\enso\enso-comunity\enso\quasimode\linewindows.py", line 44, in <module>
    from enso import cairo
  File "C:\oreyes\apps\enso\enso-comunity\enso\cairo.py", line 3, in <module>
    __cairoImpl = enso.providers.getInterface( "cairo" )
  File "C:\oreyes\apps\enso\enso-comunity\enso\providers.py", line 137, in getInterface
    interface = provider.provideInterface( name )
  File "C:\oreyes\apps\enso\enso-comunity\enso\platform\win32\__init__.py", line 61, in provideInterface
    import enso.platform.win32.cairo
  File "C:\oreyes\apps\enso\enso-comunity\enso\platform\win32\cairo\__init__.py", line 1, in <module>
    from _cairo import *
ImportError: No module named _cairo

【讨论】:

以上是关于从python加载dll的主要内容,如果未能解决你的问题,请参考以下文章

从python加载dll

用于将数据从AWS S3加载到Redshift的Python脚本

Python ctypes:从相对路径加载 DLL

python 从CSV文件加载

在 python 3 中使用 pyspark 从 MySql db 加载数据

Python 将数据从 Redshift 加载到 S3