Pushbullet на python выдает ошибку импорта из-за того, что python-magic не может найти libmagic?
Я пытаюсь использовать PushBullet.py
который использует python-magic
который в свою очередь использует libmagic
,
Я следовал инструкциям по зависимостям, установил Cygwin и скопировал три файла в Windows\system32
каталог, но все равно получаю следующую ошибку:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 161, in <module>
raise ImportError('failed to find libmagic. Check your installation')
ImportError: failed to find libmagic. Check your installation
РЕДАКТИРОВАТЬ
Если я поставлю cygmagic-1.dll
ИЛИ ЖЕ cygz.dll
в C:\Python27\
и переименуйте его в magic.dll
Я получаю следующую ошибку:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 143, in <module>
libmagic = ctypes.CDLL(dll)
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
Если я поставлю cygwin1.dll
в C:\Python27\
и переименуйте его в magic.dll
Я получаю следующую ошибку:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 185, in <module>
magic_open = libmagic.magic_open
File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'magic_open' not found
Я делаю это на 64-битной Windows 7 под управлением Python 32bit 2.7.8 (новая установка сегодня, чтобы попытаться решить эту проблему).
Кто-нибудь знает, как решить проблему?
РЕДАКТИРОВАТЬ: пробовал еще на 5 разных компьютерах с Windows, и все 5 имеют одинаковые проблемы.
3 ответа
Из путей Windows в ваших списках трассировки я предполагаю, что вы пытаетесь выполнить скрипт PushBullet из версии Python для Windows. Почему вы установили Cygwin, если не используете его? Python для Windows действительно не будет использовать библиотеки Cygwin.
Вы должны выполнить PushBullet.py
из Cygwin, использующего Python для Cygwin, а не из консоли Windows, использующей Python для Windows. Это означает, например, выполнить bash
(что-то вроде C:\cygwin64\bin\bash.exe --login -i
) и из bash
выполнить скрипт PushBullet: python PushBullet.py
,
Ожидается, что у вас уже установлены Python и python-magic для Cygwin (для Cygwin! Не для Windows).
Копирование DLL в ваши системные каталоги - это чепуха, не делайте этого. Переименование их - это супер- нонсенс. Как вы ожидали, что это может работать? Каждая библиотека специфична, вы не можете просто переименовать ее, чтобы изменить ее внутреннюю работу.
Я уже использую PushBullet в течение некоторого времени, поэтому меня заинтересовал именно этот скрипт на Python. Я также использую Cygwin в течение многих лет. Итак, я установил библиотеку PushBullet:
pip install pushbullet.py
Тогда я создал очень простой скрипт test.py
:
#!/usr/bin/python
from pushbullet import PushBullet
pb = PushBullet('my_access_token')
success, push = pb.push_note("Testing title", "Hello world!")
Когда я выполнил это с помощью ./test.py
Я получил сообщение об ошибке, что мне не хватает magic
библиотека, поэтому я установил python-magic
библиотека с помощью утилиты настройки Cygwin.
Я выполнил это снова и вуаля - у меня есть "Привет мир!" сообщение на моем телефоне. Готово.
Просто еще раз примечание: я выполнил его из оболочки Cygwin (zsh, но вы получите bash
Я думаю), а не из консоли Windows. Я также не использовал Python для Windows, но версию Cygwin. Не смешивайте исполняемые файлы Windows и Cygwin!
Так что глупые шаги будут:
- скачать и выполнить
setup.exe
с http://cygwin.com/ - устанавливать
python
а такжеpython-magic
- запустить оболочку Cygwin (вы можете запустить "Терминал Cygwin" из меню "Пуск" или просто выполнить
C:\cygwin64\bin\bash.exe --login -i
например, из диалогового окна "Выполнить" или консоли Windows) - устанавливать
pip
(см., например, Pip install не работает в Windows 7 Cygwin install) - установить библиотеку PushBullet:
pip install pushbullet.py
- подготовить свой сценарий тестирования
- выполнить это:
python testing_script.py
или простоtesting_script.py
если он содержит строку shebang и является исполняемым - должно сработать, если нет, опубликуйте свои ошибки, пожалуйста
Спасибо за подсказку к полезной библиотеке:)
У меня была та же проблема с python-magic, и я решил ее, исправив следующую строку в magic.py
файл (C:\Python27\lib\site-packages\magic.py
в моем ПК):
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1')
Так как я установил libmagic
от Cygwin, DLL была названа cygmagic-1.dll
, Поэтому я просто добавил другой вариант в предыдущей строке:
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1') \
or ctypes.util.find_library('cygmagic-1')
Не забудьте добавить cygwin\bin
на ваш PATH
,
РЕДАКТИРОВАТЬ: Кажется, что эта проблема была решена в хранилище GitHub.
РЕДАКТИРОВАТЬ 2: Это шаги, которые я следовал, чтобы сделать PushBullet.py
работа на моей машине:
- устанавливать
PushBullet.py
с помощьюpip
(pip install PushBullet.py
); - устанавливать
libmagic
от Cygwin; - добавлять
C:\cygwin\bin\
кPATH
переменная окружения; - Изменить
magic.py
файл, как я объяснил выше. (В моем случае ошибка была в строке 139)
Вы не можете смешивать двоичные файлы Cygwin и MSVCRT. Поэтому, чтобы использовать python-magic с Windows Python, вы должны получить скомпилированный для Windows libmagic и исправить magic.py, чтобы найти libmagic DLL.
В противном случае, если вы хотите использовать Python-магию Cygwin как есть, вам нужно использовать пакеты Python Cygwin.