在Windows上使用python中的libarchive

时间:2016-05-11 14:02:02

标签: python windows libarchive

我试图在Windows上的python 3.4中运行libarchive模块。 我已经用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%但它仍然无法加载模块。因为它没有给我这个名字,所以我不确定它正在寻找什么模块。 我错过了什么?

1 个答案:

答案 0 :(得分:3)

(免责声明)我向https://github.com/Changaco/python-libarchive-c投稿,并保留https://github.com/nexB/scancode-toolkit

两者都包含ctypes的{​​{1}}绑定,但ScanCode仅用于提取。

我的答案是libarchive,但是ScanCode包含了你正在寻找的一些DLL,所以我在两者中加入了一些。

要让python-libarchive-c进入Windows,您需要一个python-libarchive-c DLL及其可以加载的deps。

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

通常从路径加载DLL - 假设var MinGW32包含该DLL的完整路径 - 请使用以下命令: libarchive 现在这是Scancode。对于 lib = ctypes.CDLL(libarchive) ,您可以尝试将python-libarchive-c变量设置为指向DLL的路径: LIBARCHIVE

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

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

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

ScanCode尚未使用set LIBARCHIVE="C:\.....\libarchive.dll" ATM但是不同的/自定义ctypes绑定仅关注更具体的提取用例。至少它允许您访问Win DLL及其deps(或构建它们的指令)以及如何正确加载它的示例。

/ HTH