use*_*437 8 python windows gnuwin32 python-magic
我需要为Windows上的某些文件获取mime类型,所以我安装了python-magic
(在32位python 2.7.3上).
这取决于unix magic
库.
作者指示得到regex2.dll
,zlib1.dll
并magic1.dll
从项目的GnuWin32.所以我将文件保存到文件夹并将文件夹添加到我的系统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!
Run Code Online (Sandbox Code Playgroud)
DLL在PATH中,我尝试调试并且magic1.dll
位置正确,但是库中的某处会引发异常.
里面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)
Run Code Online (Sandbox Code Playgroud)
这显然是因为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
Run Code Online (Sandbox Code Playgroud)
更新2(已解决):
print(magic.Magic())
magic.MagicException: could not find any magic files!
print(magic.Magic(magic_file = 'magic'))
<magic.Magic instance at 0x02A5E198>
Run Code Online (Sandbox Code Playgroud)
只需要明确指定文件
小智 11
对于未来的谷歌访问者:另一个解决方案是在系统设置中设置%MAGIC%环境变量以指向魔术文件,对我来说它是:
"c:\Program Files (x86)\GnuWin32\share\misc\magic"
Run Code Online (Sandbox Code Playgroud)
无需在程序中硬编码路径!
文件路径magic
必须显式传递给构造函数。
magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic'))
Run Code Online (Sandbox Code Playgroud)