Использование 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 и ее командам (или инструкции по их сборке) и пример того, как правильно ее загрузить.
/ НТН