我试图让窗口上的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
两者都包含libarchive
的ctypes
绑定,尽管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