在Windows上缺少`magic`库的文件

时间:2013-02-07 22:08:53

标签: python windows gnuwin32 python-magic

我需要为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: 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>

只需明确指定文件

4 个答案:

答案 0 :(得分:11)

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

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

无需对程序中的路径进行硬编码!

答案 1 :(得分:2)

magic文件的路径必须显式传递给构造函数。

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

答案 2 :(得分:2)

由于python-magic问题似乎很常见,这里是未来googlers的一个有效解决方案: 在测试了大多数解决方案而不改变源代码之后,我发现以下内容可以让python-magic开箱即用:

  1. 首先安装GnuWin32 file
  2. 将环境变量MAGIC = path \设置为\ gnuwin32 \ share \ misc \ magic
  3. 确保可以通过以下方式访问所有已安装的可执行文件/库 PATH
  4. 通过pip安装python-magic

答案 3 :(得分:0)

请尝试安装此软件包:

pip install python-magic-bin