4

我正在尝试让 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% 但它仍然无法加载模块。因为它没有给我名字,所以我不确定它在寻找什么模块。我错过了什么?

4

1 回答 1

4

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

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

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

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

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

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

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

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

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

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

/HTH

于 2016-05-11T21:49:30.073 回答