2016-05-11 56 views
3

我试图在窗口中使用Python 3.4中的libarchive模块。 我已经安装了libarchive-C具有画中画和所有去确定,但每当我试图将其导入到我的代码,甚至运行它独自I'me收到错误:在Windows上使用libarchive在python上

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%,但它仍然无法加载模块。由于它不给我名字,我不确定它正在寻找什么模块。 我错过了什么?

+0

它正在寻找'LIBARCHIVE'环境变量或“archive.dll”的DLL名称。我建议使用'LIBARCHIVE'而不是重命名DLL。在运行Python之前,可以在命令提示符下使用'set LIBARCHIVE = libarchive2.dll'来测试它。请注意,这是一个32位的DLL,因此您必须使用32位的Python。 – eryksun

回答

3

(声明)予有助于https://github.com/Changaco/python-libarchive-c和我维持https://github.com/nexB/scancode-toolkit

两者都包含一个用于​​结合libarchive,虽然扫描码仅用于提取。

我在这里的答案是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/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 Win/Linux/Mac为特定的32位或64位的磁道。你可以看到在行动中有代码: https://github.com/nexB/scancode-toolkit/blob/develop/src/extractcode/libarchive2.py#L64

扫描码没有使用python-libarchive-c ATM还没有,但不同的/自定义的ctypes绑定只集中在一个更具体的使用情况下提取的。至少它可以让你访问Win DLL及其代码(或构建它们的指令)以及如何正确加载的例子。

/HTH

+0

@NosIreland你是否能够正常工作? –

+0

***我***试过了,但libarchive模块仍然找不到libarchive.DLL - 即使我在cmd.exe中设置了LIBARCHIVE变量 –

+1

我不得不更改模块中的代码:if _FILEPATH == '': _FILEPATH ='ctypes.util.find_library('libarchive') if _FILEPATH is None: _FILEPATH ='libarchive.dll'' < - * to * ***。dll *** * instead of * **。so *** –