加载 dll 时 Python CFFI 模块失败:OSError 0x7e

Posted

技术标签:

【中文标题】加载 dll 时 Python CFFI 模块失败:OSError 0x7e【英文标题】:Python CFFI module fails when loading dll: OSError 0x7e 【发布时间】:2013-12-09 01:19:21 【问题描述】:

我在 64 位 Windows 7 下运行 Python 3.3(Anaconda 发行版)。我尝试安装 Weasyprint 应用程序/库,它有许多依赖项,包括 CFFI,我必须从源代码编译它,因为二进制分发中没有兼容版本。

当我运行 weasyprint 时,它在导入加载过程中阻塞,特别是当它调用 CFFI 以便为 Cairo 加载 GTK+ 库 dll 时。我得到的错误如下:

$ weasyprint
Traceback (most recent call last):
  File "c:\anaconda\envs\py33\lib\site-packages\cffi-0.8-py3.3-win-amd64.egg\cffi\api.py", line 399, in _make_ffi_library
    backendlib = backend.load_library(name, flags)
OSError: cannot load library libcairo-2.dll: error 0x7e

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Anaconda\envs\py33\Scripts\weasyprint-script.py", line 9, in <module>
    load_entry_point('WeasyPrint==0.20', 'console_scripts', 'weasyprint')()
  File "C:\Anaconda\envs\py33\lib\site-packages\pkg_resources.py", line 343, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "C:\Anaconda\envs\py33\lib\site-packages\pkg_resources.py", line 2355, in load_entry_point
    return ep.load()
  File "C:\Anaconda\envs\py33\lib\site-packages\pkg_resources.py", line 2061, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "c:\anaconda\envs\py33\lib\site-packages\weasyprint-0.20-py3.3.egg\weasyprint\__init__.py", line 309, in <module>
    from .css import PARSER, preprocess_stylesheet
  File "c:\anaconda\envs\py33\lib\site-packages\weasyprint-0.20-py3.3.egg\weasyprint\css\__init__.py", line 30, in <module>
    from . import computed_values
  File "c:\anaconda\envs\py33\lib\site-packages\weasyprint-0.20-py3.3.egg\weasyprint\css\computed_values.py", line 18, in <module>
    from .. import text
  File "c:\anaconda\envs\py33\lib\site-packages\weasyprint-0.20-py3.3.egg\weasyprint\text.py", line 18, in <module>
    import cairocffi as cairo
  File "c:\anaconda\envs\py33\lib\site-packages\cairocffi-0.5.1-py3.3.egg\cairocffi\__init__.py", line 39, in <module>
    cairo = dlopen(ffi, 'libcairo-2.dll', 'cairo', 'libcairo-2')
  File "c:\anaconda\envs\py33\lib\site-packages\cairocffi-0.5.1-py3.3.egg\cairocffi\__init__.py", line 34, in dlopen
    return ffi.dlopen(names[0])  # pragma: no cover
  File "c:\anaconda\envs\py33\lib\site-packages\cffi-0.8-py3.3-win-amd64.egg\cffi\api.py", line 117, in dlopen
    lib, function_cache = _make_ffi_library(self, name, flags)
  File "c:\anaconda\envs\py33\lib\site-packages\cffi-0.8-py3.3-win-amd64.egg\cffi\api.py", line 405, in _make_ffi_library
    backendlib = backend.load_library(path, flags)
OSError: cannot load library C:\Windows\system32\libcairo-2.dll: error 0x7e 

我的环境如下:Windows 7.1 64位,Python 3.3 64位,CFFI在Visual Studio 2010下编译(由我),64位环境,开罗的libcairo-2.dll也在64位-bit 版本。

我不是 Windows 程序员,只是因为我想让 Weasyprint 为另一个(Python 语言)项目工作而钻研这个烂摊子。我很久以前在Delphi下做过一点Windows编程,所以我对这些东西的工作原理有一个模糊的了解,但我一直无法解决这个问题。

【问题讨论】:

最后问题解决了吗?我面临同样的错误,不知道从哪里开始修复它。任何建议表示赞赏。谢谢! 问题是 CFFI 必须使用 Visual Studio 编译,因为 DLL 必须与在该工具链下编译的 Python 兼容。我有 VS 2010 Express,它带有 C++,但是如果我没记错的话,CFFI 被设计为在 VS 2007 下编译,并且微软改变了它的 make 系统,所以你不能再使用 vsbuild(或者类似的东西同样令人讨厌)。显然,MS 世界不像 *nix 世界,你 2014 年的工具链仍然几乎可以编译 1986 年的代码。所以我是 SOL... 我在 Mac 机器上运行 weasyprint 来解决这个问题。 【参考方案1】:

我遇到了类似的错误(DLL 冲突),最终只需将 GTK 的路径(例如:“C:\gtk\bin”)移动到我的环境变量的开头即可解决。

【讨论】:

并且不要尝试使用“C:\gtk+\bin”。它不喜欢路径中的空格或 +。 这对我不起作用。我仍然收到错误'OSError: dlopen() failed to load a library: cairo / cairo-2' @BCR - 我猜你缺少一些依赖项。我想我用这个工具dependencywalker.com 找到了一些我遗漏的东西。我认为对我有用的版本是 pycairo-1.8.10.win32-py2.7.exe 和 gtk+-bundle_2.22.1-20101229_win64.zip 。希望对您有所帮助。 感谢依赖步行者的建议。选择 weasyprint.exe 时出现此输出错误:未找到至少一个必需的隐式或转发依赖项。 我不知道如何解释 谢谢,这有帮助。我认为问题出在我的安装目录中有一个空格(但我也将路径移到了环境变量的开头),这很烦人。【参考方案2】:

安装 GTK+ 对我不起作用。 我使用UniConverter2.0 解决了这个问题。 我的环境是

Python 3.7 Windows 10 x64
    安装uniconvertor-2.0rc4-win64_headless.msi, 在UniConverter安装路径下找到“dll”子目录。(在我的例子中,C:\Program Files\UniConvertor-2.0rc4\dlls) 将此“dll”路径添加到系统路径。 关闭 VSCode(或其他)并重新打开项目。 尝试再次运行您的代码。 尽情享受吧!

【讨论】:

以上是关于加载 dll 时 Python CFFI 模块失败:OSError 0x7e的主要内容,如果未能解决你的问题,请参考以下文章

python 3.5(Anaconda 包)上的 Pymssql 问题:Dll 加载失败:找不到特定模块

ImportError:导入聚合时DLL加载失败:找不到指定的模块

TensorFlow ImportError:导入_pywrap_tensorflow_internal时DLL加载失败:找不到指定的模块

无法导入numpy,DLL加载失败:找不到指定的模块

python 3.6 on win 10 editdistance模块无法导入(DLL加载失败问题)

模块dynwrapx.dll已加载 调用失败