Python-magic имеет ошибку OSError: [WinError 193] при работе в 32-битной версии IDLE

Я пытался установить модуль python-magic в течение нескольких часов, и у меня возникли некоторые проблемы. Я использую 32-битную версию Python 3.5.2 с 64-битной Windows 7.

Сначала я использовал командуpip install python-magicMsgstr "Я скачал magic1.dll, regex2.dll и zlib1.dll, а также магию из проекта" Файлы для Windows "и скопировал эти четыре файла в

C:\Program Files (x86)\Python35-32\Lib\site-packages\python_magic-0.4.12-py3.5.egg-info.

Я добавил вышеупомянутый каталог в начало переменной PATH в моих переменных среды Windows. Затем я открыл оболочку IDLE и набрал "import magic"и получил ответ OSError: [WinError 126] The specified module could not be found,

Я прочитал, что "волшебный" файл должен иметь расширение.dll, поэтому я переименовал его. Это привело к всплывающему предупреждению Windows "C:\Program Files (x86)\Python35-32\Lib\site-packages\magic.dll is either not designed to run on Windows or contains an error" и Python, "OSError: [WinError 193] %1 is not a valid Win32 applicationMsgstr "Я прочитал, что последняя ошибка часто встречается при запуске в 64-битной среде, но я удостоверился, что она работает в 32-битном IDLE и у меня установлена ​​только 32-битная версия Python.

Следуя советам предыдущих сообщений Stackru, я попытался скопировать cygmagic-1.dll, cygwin1.dll и cygz.dll в C:\Windows\System32, в ту же папку, что и magic.dll, а также попытался переименовать cygmagic-1..dll как magic1.dll, но это не имело никакого эффекта. Я знаю, что в других местах говорят, что вы не должны смешивать Cygwin Python и Windows Python, но я пробовал это без участия этих файлов, и тогда это тоже не сработало.

Я попытался переименовать magic.dll в magic.exe, и это позволило "импортировать магию" и магию.Magic(magic_file=r'C:\Program Files (x86)\Python35-32\Lib\site-packages\python_magic-0.4.12-py3.5.egg-info\magic.exe') with the response "<magic.Magic object at 0x02EA0A70>". When I tried testing with magic.from_file(r'C:\Program Files (x86)\Python35-32\Lib\site-packages\README.txt'), though, I got the error magic.MagicException: b'could not find any magic files! Я полагал, что переименование его в magic.exe должно быть неправильным, но это стоит попробовать.

После того, как я отказался от Python-magic, кто-то порекомендовал более старый проект. Я скачал его и поместил папку pymagic в каталог site-packages. Когда я попытался импортировать pymagic.pymagic, он сказал мне, что модуль StringIO не существует, а рекомендующий сказал, что это потому, что StringIO из Python2. Я изменил все упоминания о StringIO на io и попробовал команду pymagic.pymagic.identify_file(r'E:\Pictures\picture.jpg')

Это породило ошибку TypeError: startswith first arg must be bytes or a tuple of bytes, not str. Я недостаточно вовлечен в модули Python для os, io и т. Д., Чтобы знать, как вносить изменения, чтобы заставить это работать. Кто-нибудь может дать какие-либо рекомендации о том, как заставить работать python-magic или pymagic, или любой другой модуль для идентификации файла на основе его заголовка? Я знаю, что этот вопрос задавали много, но предыдущие ответы не сработали для меня.

1 ответ

Решение

Вы называли "волшебный" файл данных? magicи оставьте его в той же папке, что и magic1.dll?

Следуя вашим инструкциям, я смог воспроизвести ту же ошибку, что и вы. Используя Sysinternals Process Monitor, я увидел, что причиной вашей первой ошибки было то, что Python пытался загрузить волшебный файл данных, как если бы это была библиотека.

Затем я переименовал магический файл данных в magic_data, перезапустил IDLE, и все заработало. Я мог бы тогда использовать magic идентифицировать файл:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import magic
>>> fn = r'C:\Python34\Lib\site-packages\python_magic-0.4.12-py3.4.egg-info\magic_data'
>>> m = magic.Magic(magic_file=fn)
>>> m.from_file(r'C:\Python34\Lib\site-packages\python_magic-0.4.12-py3.4.egg-info\zlib1.dll')
'PE32 executable for MS Windows (DLL) (console) Intel 80386 32-bit'

(Я использую другую версию Python (3.4) и другую версию Windows (10) для вас, но я не думаю, что это имеет большое значение.)

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