【问题标题】:Using libarchive in python on Windows在 Windows 上的 python 中使用 libarchive
【发布时间】:2016-09-06 23:51:58
【问题描述】:

我正在尝试让 libarchive 模块在 windows 上的 python 3.4 中工作。 我已经用 pip 安装了 libarchive-c,一切正常,但是每当我尝试将它导入我的代码甚至单独运行它时,我都会收到错误:

OSError: [WinError 126] The specified module could not be found

这是来自以下代码的 ffi.py:

libarchive_path = os.environ.get('LIBARCHIVE') or find_library('archive') 
libarchive = ctypes.cdll.LoadLibrary(libarchive_path)

我以前从未使用过 ctypes,但如果我理解正确,它正在寻找外部 DLL。所以找到并安装了http://gnuwin32.sourceforge.net/packages/libarchive.htm 我也添加了 C:\Program Files (x86)\GnuWin32\bin 到我的 %PATH% 环境变量中,但它仍然无法加载模块。因为它没有给我名字,所以我不确定它在寻找什么模块。 我错过了什么?

【问题讨论】:

  • 它正在寻找来自LIBARCHIVE 环境变量或“archive.dll”的DLL 名称。我建议使用LIBARCHIVE 而不是重命名 DLL。在运行 Python 之前,您可以在命令提示符下使用 set LIBARCHIVE=libarchive2.dll 对此进行测试。请注意,这是一个 32 位 DLL,因此您必须使用 32 位 Python。

标签: python windows libarchive


【解决方案1】:

(免责声明)我为https://github.com/Changaco/python-libarchive-c 做出贡献并维护https://github.com/nexB/scancode-toolkit

两者都包含 libarchivectypes 绑定,但 ScanCode 仅用于提取。

我在这里的答案是python-libarchive-c,但 ScanCode 包含您正在寻找的一些 DLL,所以我在两者中都有一点。

要让 python-libarchive-c 在 Windows 上运行,您需要一个 libarchive DLL 及其可以加载的 deps。

python-libarchive-c 中没有捆绑预构建的 DLL,但我在这里为另一个项目预构建了 Windows 二进制文件: https://github.com/nexB/scancode-toolkit/tree/develop/src/extractcode/bin/win-32/bin 对应的源码有:https://github.com/nexB/scancode-thirdparty-src 如果你想自己从源代码重建,你有 MinGW32 构建说明:https://github.com/nexB/scancode-thirdparty-src/blob/master/libarchive/build.sh#L47

通常从路径加载 DLL —— 假设 var libarchive 包含该 DLL 的完整路径—— 使用这个: lib = ctypes.CDLL(libarchive) 现在这是扫描码。对于python-libarchive-c,您可以尝试将LIBARCHIVE 变量设置为指向您的DLL 的路径: set LIBARCHIVE="C:\.....\libarchive.dll"

然后启动 Python,导入库并使用它。

注意:我没有测试这个(还),但这应该可以工作。如果不是,请提交错误。 我也没有在 Python 3.4 上运行任何测试。我主要使用 Python 2.7。 但是 DLL 和代码根本不是 Python 2.7 特定的。

FWIW,扫描码加载库的方式更有吸引力,因为它可以从相同的代码加载 DLL,用于使用常规位置的特定 32 或 64 位拱门。您可以在此处查看运行中的代码: https://github.com/nexB/scancode-toolkit/blob/develop/src/extractcode/libarchive2.py#L64

ScanCode 尚未使用python-libarchive-c ATM,而是使用不同/自定义的 ctypes 绑定,仅专注于更具体的提取用例。至少它可以让您访问 Win DLL 及其依赖项(或构建它们的指令)以及如何正确加载它的示例。

/HTH

【讨论】:

  • 试过了,但 libarchive 模块仍然找不到 libarchive.DLL - 即使我在 cmd.exe 中设置了 LIBARCHIVE 变量
  • 我不得不更改模块中的代码:if _FILEPATH == '': _FILEPATH = ctypes.util.find_library('libarchive') if _FILEPATH is None: _FILEPATH = 'libarchive.dll' to .dll 而不是 .so
  • 此外,这似乎在没有补丁的情况下在 windows 下工作(但我们当然仍然需要 DLL)github.com/Changaco/python-libarchive-c
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2016-01-26
  • 2012-01-10
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多