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