Windows上'magic`库文件丢失

问题描述:

我需要在Windows上获取某些文件的mime类型,所以我已经安装了python-magic(在32位python 2.7.3上)。
这取决于unix magic库。
作者指示从gnuwin32项目获取regex2.dll,zlib1.dllmagic1.dll。 因此,我将这些文件保存到一个文件夹,并将该文件夹添加到我的系统PATH
现在,当我执行magic方法,我得到丢失的文件例外:Windows上'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包内我发现magicmagic.mgc。我把它们放置到同一个文件夹,并在

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) 

这显然是因为蟒蛇试图打开magic文件作为DLL,它是纯文本得到WindowsError: [Error 126]。在代码中添加.dll到文件名后,我得到相同的magic.MagicException: could not find any magic files!
我错过了哪些文件?

UPDATE:

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> 

刚刚到指定文件中明确

+0

愚蠢的问题访问,让你重新启动命令提示符后,你已经添加DLL的到'PATH'和你之前执行的脚本? (愚蠢的问题,因为你明明知道身边的ctypes自己的方式) – Torxed

+0

“你重新启动命令提示符后,你已经添加DLL的到PATH” - 是的,我确实 – user2052437

+0

试图将DLL的在同一目录下,并尝试ctypes的在那些?或者如果这可能有助于开始?我不知道他们是否正在寻找某个特定位置的DLL,例如'。/',但尝试它可能不错? - 废话,只是重新读这个问题..你已经做了..(我累了,00:00 AM在这里) – Torxed

路径magic文件必须明确地传递给构造函数。

magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic')) 
+3

我们应该在哪里传递魔法文件的路径? – picomon

+0

@picpic完美的问题。沟通能力有限的人倾向于忘记提及这些细节 –

对于未来的谷歌用户:另一种解决方案是设置%MAGIC%环境变量在系统中设置为指向魔术文件,对我来说是:

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

无需硬编码在你的程序路径!

由于蟒蛇魔法的问题似乎是相当普遍的,在这里FO未来的Google工作的解决方案: 不改变源代码测试的大多数解决方案之后,我发现下面让蟒蛇魔法工作开箱:

  1. 安装GnuWin32 file第一
  2. 设置环境变量MAGIC =路径\到\的GnuWin32 \共享\杂项\魔
  3. 确保所有人安装的可执行文件/ lib目录raries是通过 PATH
  4. 通过PIP安装python-魔法