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

最佳答案

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

两者都包含 ctypeslibarchive 绑定(bind),尽管 ScanCode 仅用于提取。

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

要在 Windows 上运行 python-libarchive-c,您需要一个 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 绑定(bind)只专注于更具体的提取用例。至少它使您可以访问 Win DLL 及其依赖项(或构建它们的指令)以及有关如何正确加载它的示例。

/HTH

关于python - 在 Windows 上的 python 中使用 libarchive,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37165002/

10-15 16:02