Отсутствуют файлы для библиотеки `magic` в Windows

Мне нужно получить MIME-тип для некоторых файлов в Windows, поэтому я установил python-magic (на 32-битном python 2.7.3).
Это зависит от библиотеки unix magic.
Автор дает указание получить regex2.dll, zlib1.dll и magic1.dll из проекта gnuwin32. Итак, я сохранил файлы в папку и добавил папку в свою систему PATH.
Теперь, когда я выполняю методы magic, я получаю исключение отсутствующего файла:

import magic
print(magic.Magic())

Traceback (most recent call last):
File "C:/Users/Admin/PycharmProjects/lex/lex.py", line 367, in <module>
  test_magic()
File "C:/Users/Admin/PycharmProjects/lex/lex.py", line 364, in test_magic
  print(magic.Magic())
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 52, in __init__
  magic_load(self.cookie, magic_file)
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 188, in magic_load
  return _magic_load(cookie, coerce_filename(filename))
File "C:\Python27\lib\site-packages\python_magic-0.4.3-py2.7.egg\magic.py", line 139, in errorcheck
  raise MagicException(err)
magic.MagicException: could not find any magic files!

DLL находятся в PATH, я попытался отладить, и magic1.dll находится правильно, но где-то внутри библиотеки выдает исключение.
Внутри пакета gnuwin32 я нашел magic и magic.mgc. Я поместил их в ту же папку и получил WindowsError: [Error 126] на

libmagic = None  
# Let's try to find magic or magic1  
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1')  

# This is necessary because find_library returns None if it doesn't find the library
if dll:
    libmagic = ctypes.CDLL(dll)

Очевидно, это происходит потому, что python пытается открыть файл magic как dll, который представляет собой обычный текст. После добавления .dll к именам файлов в коде я получаю то же самое magic.MagicException: could not find any magic files!.
Какие файлы мне не хватает?

ОБНОВЛЕНИЕ:

C:\Users\Admin>file C:\123.zip -m magic
file: could not find any magic files!

C:\Users\Admin>file C:\123.zip -m "C:\@DEV\@LIB\@Magic\GetGnuWin32\bin\magic"
C:\123.zip; ASCII text, with no line terminators

C:\Users\Admin>cd C:\@DEV\@LIB\@Magic\GetGnuWin32\bin

C:\@DEV\@LIB\@Magic\GetGnuWin32\bin>file C:\123.zip -m magic
C:\123.zip; ASCII text, with no line terminators

ОБНОВЛЕНИЕ 2 (РЕШЕНО):

print(magic.Magic())
magic.MagicException: could not find any magic files!

print(magic.Magic(magic_file = 'magic'))
<magic.Magic instance at 0x02A5E198>

просто нужно было явно указать файл


person user2052437    schedule 07.02.2013    source источник
comment
Глупый вопрос, вы перезапустили командную строку ПОСЛЕ того, как добавили DLL в PATH и ДО того, как выполнили скрипт? (глупый вопрос, поскольку вы, очевидно, разбираетесь в ctypes)   -  person Torxed    schedule 08.02.2013
comment
Вы перезапустили командную строку ПОСЛЕ того, как добавили DLL в PATH - да, я сделал   -  person user2052437    schedule 08.02.2013
comment
Пробовали поместить dll в тот же каталог и попробовать ctypes на них? или если это может помочь начать с? Я не знаю, ищут ли они DLL в определенном месте, например ./, но может быть, стоит просто попробовать? - Черт, просто перечитай вопрос.. ты уже сделал.. (я устал, 00:00 здесь)   -  person Torxed    schedule 08.02.2013
comment
Пробовал класть в одну директорию со своим скриптом - все то же самое.   -  person user2052437    schedule 08.02.2013
comment
Помогает ли это: bytes.com/topic/python/answers/ (в частности, часть об именах папок, в которые должны быть помещены библиотеки DLL)   -  person Torxed    schedule 08.02.2013
comment
Я пробовал общий доступ, общий доступ/файл, файл, файл/общий доступ, файл/общий ресурс/файл и каталоги c:/program files/file/share/file/. Ничего из этого не помогло.   -  person user2052437    schedule 08.02.2013
comment
Пробовали использовать параметр -m на Python при запуске скрипта и получить тип импорта модуля и более подробную информацию о том, что происходит? Python -h для получения дополнительных параметров параметров, но они могут дать вам лучшее представление о том, что он пытается импортировать и куда, надеюсь, вы сможете сопоставить это с тем, почему библиотеки DLL отсутствуют.   -  person Torxed    schedule 08.02.2013
comment
Пожалуйста, ответьте на ваш вопрос, если я следил за вашим последним обновлением, вам не хватало фактического волшебного файла / таблицы поиска MIME-типов для суффиксов.   -  person David    schedule 21.02.2013


Ответы (4)


Для будущих посетителей Google: Другим решением является установка переменной среды %MAGIC% в настройках системы, чтобы она указывала на волшебный файл, для меня это было:

"c:\Program Files (x86)\GnuWin32\share\misc\magic"

Нет необходимости жестко указывать путь в вашей программе!

person Peter    schedule 30.01.2015

Путь к файлу magic должен быть явно передан конструктору.

magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic'))
person user2052437    schedule 21.02.2013
comment
@picomon идеальные вопросы. люди с ограниченными навыками общения склонны забывать упоминать такие детали - person Ozgur Akcali; 20.06.2016

Поскольку проблемы с магией python кажутся довольно распространенными, вот рабочее решение для будущих гуглеров: после тестирования большинства решений без изменения исходного кода я обнаружил следующее, чтобы заставить магию python работать из коробки:

  1. Установите файл GnuWin32 сначала
  2. Установите переменную среды MAGIC=path\to\gnuwin32\share\misc\magic
  3. Убедитесь, что все установленные исполняемые файлы/библиотеки доступны через PATH.
  4. Установите python-magic через pip
person Xanius    schedule 20.10.2017

Пожалуйста, попробуйте установить этот пакет:

pip install python-magic-bin
person Samuel Qian    schedule 15.04.2021