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!

Так что глупые шаги будут:

  1. скачать и выполнить setup.exe с http://cygwin.com/
  2. устанавливать python а также python-magic
  3. запустить оболочку Cygwin (вы можете запустить "Терминал Cygwin" из меню "Пуск" или просто выполнить C:\cygwin64\bin\bash.exe --login -i например, из диалогового окна "Выполнить" или консоли Windows)
  4. устанавливать pip (см., например, Pip install не работает в Windows 7 Cygwin install)
  5. установить библиотеку PushBullet: pip install pushbullet.py
  6. подготовить свой сценарий тестирования
  7. выполнить это: python testing_script.py или просто testing_script.py если он содержит строку shebang и является исполняемым
  8. должно сработать, если нет, опубликуйте свои ошибки, пожалуйста

Спасибо за подсказку к полезной библиотеке:)

У меня была та же проблема с 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 работа на моей машине:

  1. устанавливать PushBullet.py с помощью pip (pip install PushBullet.py);
  2. устанавливать libmagic от Cygwin;
  3. добавлять C:\cygwin\bin\ к PATH переменная окружения;
  4. Изменить magic.py файл, как я объяснил выше. (В моем случае ошибка была в строке 139)

Вы не можете смешивать двоичные файлы Cygwin и MSVCRT. Поэтому, чтобы использовать python-magic с Windows Python, вы должны получить скомпилированный для Windows libmagic и исправить magic.py, чтобы найти libmagic DLL.

В противном случае, если вы хотите использовать Python-магию Cygwin как есть, вам нужно использовать пакеты Python Cygwin.

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