在Windows上缺少“magic”库文件

10
我需要在Windows上获取一些文件的MIME类型,因此我已经安装了python-magic(在32位python 2.7.3上)。 它依赖于Unix magic库。 作者指导从gnuwin32项目获取regex2.dllzlib1.dllmagic1.dll。 所以我将这些文件保存到一个文件夹中,并将该文件夹添加到我的系统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包中,我找到了magicmagic.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: 找不到任何魔法文件!
我缺少哪些文件?

更新:

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>

刚才需要明确指定文件


尝试将dll文件放置在同一目录下并尝试使用ctypes进行调用?或者这样做是否有助于开始工作?我不知道它们是否正在寻找特定位置的DLL,例如“./”,但是尝试一下可能会有好处。- 糟糕,刚刚重新阅读了问题...你已经这样做了...(我很累,现在是凌晨00:00) - Torxed
已经尝试将其放置在与我的脚本相同的目录中 - 仍然一样。 - user2052437
这个链接有帮助吗:http://bytes.com/topic/python/answers/802350-module-python-magic-windows(特别是关于应该放置DLL的文件夹名称的部分)? - Torxed
我尝试过 share、share/file、file、file/share、file/share/file 和 c:/program files/file/share/file/ 目录,但都没有帮助。 - user2052437
请回答您的问题,如果我正确理解您的最后更新,您缺少实际的“魔法”文件/查找表以获取 MIME 类型和后缀名的对应关系。 - David
显示剩余3条评论
5个回答

11

针对未来的Google访问者:另一种解决方案是在系统设置中设置%MAGIC%环境变量,指向magic文件,对于我来说是:

%MAGIC%环境变量可用于指定magic文件路径。

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

不需要在程序中硬编码路径!


2
请尝试安装这个软件包:
pip install python-magic-bin

2
由于python-magic问题似乎相当普遍,这里有一个对于未来的搜索者的工作解决方案:
在不改变源代码的情况下测试了大部分解决方案后,我发现以下方法可以让python-magic直接使用:
1.首先安装 GnuWin32文件 2.设置环境变量MAGIC=path\to\gnuwin32\share\misc\magic
3.确保所有已安装的可执行文件/库都可以通过PATH访问
4.通过pip安装python-magic

2

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

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

@picomon 完美的问题。沟通能力有限的人往往会忘记提及这些细节。 - Ozgur Akcali

0

试试这个:

pip uninstall python-magic
pip uninstall python-magic-bin
pip install python-magic
pip install python-magic-bin

这意味着在安装python-magic之后安装python-magic-bin

reference:https://github.com/ahupp/python-magic/issues/248


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接