Использование libarchive в python на Windows

Я пытаюсь заставить работать модуль libarchive в python 3.4 на windows. Я установил libarchive-c с pip, и все прошло нормально, но всякий раз, когда я пытаюсь импортировать его в свой код или даже запустить его самостоятельно, я получаю сообщение об ошибке:

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% в переменных среды, но он все еще не может загрузить модуль. Поскольку это не дает мне имя, я не уверен, какой модуль он ищет. Что мне не хватает?

1 ответ

(отказ от ответственности) Я участвую в https://github.com/Changaco/python-libarchive-c и поддерживаю https://github.com/nexB/scancode-toolkit

Оба содержат ctypes привязка для libarchiveхотя ScanCode предназначен только для извлечения.

Мой ответ здесь для python-libarchive-c, но ScanCode содержит некоторые библиотеки DLL, которые вы ищете, так что я немного использую оба.

Получить python-libarchive-c иду на винду нужно libarchive DLL и ее deps, которые затем могут быть загружены.

В комплекте нет встроенных библиотек DLL python-libarchive-c но у меня есть предварительно скомпилированные бинарные файлы 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) Теперь это для Scancode. За python-libarchive-c, вы можете попытаться установить LIBARCHIVE переменная, чтобы указать путь к вашей DLL с помощью:set LIBARCHIVE="C:\.....\libarchive.dll"

Затем запустите Python, импортируйте библиотеку и используйте ее.

NB: я не проверял это (пока), но это должно работать. Если нет, пожалуйста, сообщите об ошибке. Я не запускал никаких тестов на 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

ScanCode НЕ использует python-libarchive-c ATM пока, но другая / нестандартная привязка ctypes сфокусирована только на более конкретном случае извлечения. По крайней мере, он дает вам доступ к Win DLL и ее командам (или инструкции по их сборке) и пример того, как правильно ее загрузить.

/ НТН

Другие вопросы по тегам