Хобрук: Ваш путь к мастерству в программировании

Pushbullet на python выдает ошибку импорта из-за того, что python-magic не может найти libmagic?

Я пытаюсь использовать PushBullet.py, который использует python-magic, который, в свою очередь, использует libmagic.

Я выполнил инструкции dependencies, установил 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 32-битной версией 2.7.8 (свежая установка сегодня, чтобы попытаться решить эту проблему).

Кто-нибудь знает, как решить проблему?

РЕДАКТИРОВАТЬ: попробовал еще 5 разных компьютеров с Windows, и все 5 имеют одинаковые проблемы.


  • github.com/ahupp/python-magic#dependencies 15.08.2014
  • @JohnZwinck Я уже рассказывал об этом во второй строке своего поста, это одна и та же ошибка до и после ... 15.08.2014
  • Возможно, вы можете использовать отладчик или около того, чтобы изолировать, где именно он ищет нужные файлы. 15.08.2014
  • @JohnZwinck, не могли бы вы объяснить, как это лучше всего сделать; Какой отладчик? 15.08.2014
  • В Linux я обычно использую strace и grep для libmagic, чтобы увидеть, какие файлы он пытается открыть. Может быть, у вашего Cygwin это есть; если нет, я уверен, что в Windows есть другие инструменты, например, SysInternals File Monitor, который показывает, какой процесс открывает (или не открывает) какие файлы. 15.08.2014
  • В Cygwin есть strace, но такая отладка хороша для опытных пользователей, а не для тех, кто переименовывает библиотеки DLL в надежде решить проблему :) На самом деле в этом нет необходимости, я был удивлен, как легко это на самом деле заставить работать. Просто не смешивайте исполняемые файлы Windows и Cygwin, ничего не переименовывайте, и все должно работать. 27.08.2014

Ответы:


1

Судя по путям Windows в ваших списках трассировки, я предполагаю, что вы пытаетесь выполнить скрипт PushBullet из версии Python для Windows. Зачем вы установили Cygwin, если вы им не пользуетесь? Python для Windows действительно не будет использовать библиотеки DLL 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.

Я выполнил его снова и вуаля - у меня "Hello world!" сообщение на моем телефоне. Сделанный.

Еще раз примечание: я выполнил его из оболочки Cygwin (zsh, но у вас будет bash, я думаю), а не из консоли Windows. Я также не использовал Python для Windows, а версию Cygwin. Не смешивайте исполняемые файлы Windows и Cygwin!

Такими глупыми шагами будут:

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

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

26.08.2014
  • У меня много скриптов на Windows Python, как я могу заставить PushBullet работать с версиями Windows... или как мне заставить мои скрипты работать с версией Cygwin? Я использую множество библиотек, таких как skype4py, beautifulsoup, chanize, pandas... и т.д. 27.08.2014
  • К сожалению, я не использую версии Widnows, поэтому не знаю, как заставить его работать с ними. Но я очень подробно описал, как заставить его работать с Cygwin, шаг за шагом, поэтому я не понимаю, о чем вы спрашиваете. 28.08.2014
  • Просто следуйте моим 8 глупым шагам, и это должно сработать. Было действительно очень легко заставить его работать. 28.08.2014
  • Кстати, вы можете полностью удалить версию Python для Windows и использовать только версию Cygwin. Все ваши существующие скрипты Python также будут работать с ним. Так проще установить все зависимости. 28.08.2014
  • @Ryflex Итак, вы успешно решили эту проблему? Я просто спрашиваю, помог ли вам мой ответ, потому что вы предложили вознаграждение за решение вашей проблемы. 01.09.2014

  • 2

    У меня была такая же проблема с 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.

    EDIT: кажется, что эта проблема была решена на GitHub. репозиторий.

    EDIT2: Вот шаги, которые я выполнил, чтобы заставить PushBullet.py работать на моей машине:

    1. Установить PushBullet.py через pip (pip install PushBullet.py);
    2. Установите libmagic из Cygwin;
    3. Добавьте C:\cygwin\bin\ к переменной окружения PATH;
    4. Измените файл magic.py, как я объяснил выше. (В моем случае ошибка была в строке 139)
    12.09.2014
  • Привет, fvizeus, не могли бы вы объяснить все точные шаги, которые вы сделали? 21.09.2014
  • Привет, @Ryflex! Я отредактировал ответ, чтобы дать пошаговое объяснение того, что я сделал, чтобы заставить его работать на моем ПК. 22.09.2014
  • Эй, @fvizeus, я следовал тому пути, который сработал для тебя, но я думаю, что делаю что-то не так во время установки libmagic из cygwin: S 23.09.2014
  • Для меня установка работала просто отлично. Я скачал 32-разрядную программу установки с сайта cygwin.com. Затем я приступил к рекомендуемым настройкам и выбрал зеркало. После этого меня попросили выбрать пакеты. Думаю, в этой части мне пришлось вручную выбирать libmagic для установки. Просто найдите libmagic в поле поиска и выберите пакет, расположенный на Devel. К настоящему времени он должен загрузить пакеты и приступить к установке. 30.09.2014

  • 3

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

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

    15.08.2014
    Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..