在 Windows 上的 python 中使用 libarchive

Nos*_*and 5 python windows libarchive

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

OSError: [WinError 126] The specified module could not be found
Run Code Online (Sandbox Code Playgroud)

这来自 ffi.py,代码如下:

libarchive_path = os.environ.get('LIBARCHIVE') or find_library('archive') 
libarchive = ctypes.cdll.LoadLibrary(libarchive_path)
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*nne 6

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

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

我在这里的答案是 for python-libarchive-c,但 ScanCode 包含您正在寻找的一些 DLL,因此我将两者都包含在内。

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

没有捆绑预构建的 DLL,python-libarchive-c但我在这里为另一个项目预构建了 Windows 二进制文件: https : //github.com/nexB/scancode-toolkit/tree/develop/src/extractcode/bin/win-32/bin相应的源代码在那里: https: //github.com/nexB/scancode-thirdparty-srcMinGW32如果您想自己从源代码重建, 您可以在那里找到构建说明: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,scancode 加载库的方式更加复杂,因为它可以使用传统位置从相同的代码加载 DLL Win/Linux/Mac 以获得特定的 32 或 64 位架构。您可以在那里看到正在运行的代码: https://github.com/nexB/scancode-toolkit/blob/develop/src/extractcode/libarchive2.py#L64

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

/HTH