在Windows上使用Python的libarchive

我试图让窗口上的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。 所以find并安装http://gnuwin32.sourceforge.net/packages/libarchive.htm我也添加了C:\ Program Files(x86)\ GnuWin32 \ bin到我的%PATH%环境variables,但它仍然无法加载模块。 因为它不给我的名字,我不知道它正在寻找什么模块。 我错过了什么?

(免责声明)我贡献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和它的代码,然后可以加载。

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 /扫描码第三方-SRC /斑点/主/ libarchive / build.sh#L47

一般来说,要从一个路径加载一个DLL(假设var libarchive包含该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

ScanCode不是使用python-libarchive-c ATM,而是一个不同的/自定义的ctypes绑定,只关注一个更具体的提取用例。 至少它可以让你访问Win DLL及其代码(或者构建它们的指令)以及如何正确加载的例子。

/ HTH