Windows上'magic`库文件丢失
我需要在Windows上获取某些文件的mime类型,所以我已经安装了python-magic
(在32位python 2.7.3上)。
这取决于unix magic
库。
作者指示从gnuwin32项目获取regex2.dll
,zlib1.dll
和magic1.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
包内我发现magic
和magic.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>
刚刚到指定文件中明确
路径magic
文件必须明确地传递给构造函数。
magic_object = magic.Magic(magic_file = 'path_to_magic_files/magic'))
我们应该在哪里传递魔法文件的路径? – picomon
@picpic完美的问题。沟通能力有限的人倾向于忘记提及这些细节 –
对于未来的谷歌用户:另一种解决方案是设置%MAGIC%环境变量在系统中设置为指向魔术文件,对我来说是:
"c:\Program Files (x86)\GnuWin32\share\misc\magic"
无需硬编码在你的程序路径!
由于蟒蛇魔法的问题似乎是相当普遍的,在这里FO未来的Google工作的解决方案: 不改变源代码测试的大多数解决方案之后,我发现下面让蟒蛇魔法工作开箱:
- 安装GnuWin32 file第一
- 设置环境变量MAGIC =路径\到\的GnuWin32 \共享\杂项\魔
- 确保所有人安装的可执行文件/ lib目录raries是通过 PATH
- 通过PIP安装python-魔法
愚蠢的问题访问,让你重新启动命令提示符后,你已经添加DLL的到'PATH'和你之前执行的脚本? (愚蠢的问题,因为你明明知道身边的ctypes自己的方式) – Torxed
“你重新启动命令提示符后,你已经添加DLL的到PATH” - 是的,我确实 – user2052437
试图将DLL的在同一目录下,并尝试ctypes的在那些?或者如果这可能有助于开始?我不知道他们是否正在寻找某个特定位置的DLL,例如'。/',但尝试它可能不错? - 废话,只是重新读这个问题..你已经做了..(我累了,00:00 AM在这里) – Torxed