我需要在Windows上获取mimetypes的一些文件,所以我已经安装了python-magic
(在32位python 2.7.3上)。
这取决于unix的magic
库。
作者指示从regex2.dll
项目获取regex2.dll
, zlib1.dll
和magic1.dll
。 所以我保存文件到一个文件夹,并将文件夹添加到我的系统PATH
。
现在当我执行magic
方法,我得到丢失的文件exception:
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中,我试过debugging和magic1.dll
位置正确,但库内的某处引发exception。
在gnuwin32
包里面,我发现了magic
和magic.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>
只是不得不明确指定文件
对于未来的Google访问者:另一个解决方案是在系统设置中将%MAGIC%环境变量设置为指向魔术文件,对我来说是:
"c:\Program Files (x86)\GnuWin32\share\misc\magic"
无需在程序中对路径进行硬编码!
magic
文件的路径必须显式传递给构造函数。
magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic'))
由于蟒蛇魔法问题似乎是相当普遍的,所以这里有一个工作解决方案的未来谷歌:在测试大多数解决方案,而不改变源代码后,我发现以下python魔术开箱即用: