我正在尝试让libarchive模块在windows上的python3.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)我以前从未使用过ctype,但如果我理解正确的话,它是在寻找外部DLL。所以找到并安装了http://gnuwin32.sourceforge.net/packages/libarchive.htm,我也将C:\Program Files (x86)\GnuWin32\bin添加到我的%PATH%环境变量中,但它仍然无法加载模块。因为它没有给我提供名称,所以我不确定它在寻找什么模块。我遗漏了什么?
发布于 2016-05-12 05:49:30
(免责声明)我为https://github.com/Changaco/python-libarchive-c做贡献,我维护https://github.com/nexB/scancode-toolkit
两者都包含用于libarchive的ctypes绑定,尽管ScanCode仅用于提取。
我在这里的答案是python-libarchive-c,但是ScanCode包含了您正在寻找的一些DLL,所以我在这两个库中都添加了一点。
要让python-libarchive-c在Windows上运行,您需要一个libarchive DLL和它的dep,然后可以加载它们。
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,您可以尝试使用:set LIBARCHIVE="C:\.....\libarchive.dll"设置LIBARCHIVE变量来指向您的DLL的路径
然后启动Python,导入库并使用它。
注:我还没有测试这个,但是这个应该可以工作。如果没有,请提交一个bug。我也没有在Python 3.4上运行任何测试。我主要使用Python 2.7。但是DLL和代码根本不是Python2.7特有的。
FWIW,scancode加载库的方式更有参与度,因为它可以使用传统位置从相同的代码加载特定32位或64位archs的DLL Win/Linux/Mac。您可以在那里看到实际运行的代码:https://github.com/nexB/scancode-toolkit/blob/develop/src/extractcode/libarchive2.py#L64
ScanCode还没有使用python-libarchive-c自动取款机,而是一个不同的/定制的ctype绑定,只专注于更具体的提取用例。至少它可以让你访问一个Win DLL和它的dep(或者一个编译它们的指令),以及一个如何正确加载它的例子。
/HTH
https://stackoverflow.com/questions/37165002
复制相似问题