Python-magic имеет ошибку OSError: [WinError 193] при работе в 32-битной версии IDLE
Я пытался установить модуль python-magic в течение нескольких часов, и у меня возникли некоторые проблемы. Я использую 32-битную версию Python 3.5.2 с 64-битной Windows 7.
Сначала я использовал командуpip install python-magic
Msgstr "Я скачал 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 application
Msgstr "Я прочитал, что последняя ошибка часто встречается при запуске в 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) для вас, но я не думаю, что это имеет большое значение.)