Python中的Pushbullet因python-magic无法找到libmagic而抛出导入错误?
我正在尝试使用PushBullet.py
,这个工具又依赖于python-magic
,而这个又需要用到libmagic
。
我按照依赖项的说明,安装了Cygwin,并把三个文件复制到了Windows\system32
目录,但还是遇到了以下错误:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 161, in <module>
raise ImportError('failed to find libmagic. Check your installation')
ImportError: failed to find libmagic. Check your installation
编辑
如果我把cygmagic-1.dll
或者cygz.dll
放到C:\Python27\
里,并把它重命名为magic.dll
,我会遇到以下错误:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 143, in <module>
libmagic = ctypes.CDLL(dll)
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
如果我把cygwin1.dll
放到C:\Python27\
里,并把它重命名为magic.dll
,我会遇到以下错误:
Traceback (most recent call last):
File "C:\New Python ActiveX Scripting Engine.py", line 1, in <module>
from pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\__init__.py", line 2, in <module>
from .pushbullet import PushBullet
File "C:\Python27\lib\site-packages\pushbullet\pushbullet.py", line 4, in <module>
import magic
File "C:\Python27\lib\site-packages\magic.py", line 185, in <module>
magic_open = libmagic.magic_open
File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'magic_open' not found
我是在运行64位Windows 7的电脑上,使用的是32位的Python 2.7.8(今天刚安装的,目的是解决这个问题)。
有没有人知道怎么解决这个问题?
编辑:我在另外5台不同的Windows电脑上试过,结果都是同样的问题。
3 个回答
你不能把Cygwin和MSVCRT的程序混在一起用。因此,如果你想在Windows上用python-magic,就得找一个专门为Windows编译的libmagic,并且要修改magic.py文件,让它能找到这个libmagic的DLL文件。
如果你想直接使用Cygwin的python-magic,那就得用Cygwin的Python包。
我之前也遇到过和python-magic一样的问题,后来通过修改我电脑上这个文件中的一行代码解决了这个问题:magic.py
(路径是C:\Python27\lib\site-packages\magic.py
)。
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1')
因为我是在Cygwin上安装的libmagic
,所以生成的DLL文件叫cygmagic-1.dll
。所以我就在前面那一行代码里加了一个选项:
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1') \
or ctypes.util.find_library('cygmagic-1')
别忘了把cygwin\bin
加到你的PATH
环境变量里。
编辑:看起来这个问题在GitHub的项目页面上已经解决了。
编辑2:这是我在我的电脑上让PushBullet.py
正常工作的步骤:
- 通过
pip
安装PushBullet.py
(命令是pip install PushBullet.py
); - 从Cygwin安装
libmagic
; - 把
C:\cygwin\bin\
添加到PATH
环境变量里; - 按照我上面说的修改
magic.py
文件。(在我这儿,错误出现在第139行)
从你错误信息中的Windows路径来看,我猜你是在Windows版本的Python上运行PushBullet脚本。既然你不打算使用Cygwin,那你为什么还要安装它呢?Windows版的Python是不会使用Cygwin的DLL文件的。
你需要在Cygwin中用Cygwin的Python来执行PushBullet.py
,而不是在Windows控制台中用Windows的Python来执行。这意味着你需要先打开bash
(比如运行C:\cygwin64\bin\bash.exe --login -i
),然后在bash
中执行PushBullet脚本:python PushBullet.py
。
这要求你已经安装了Cygwin版的Python和python-magic(一定是Cygwin版!不是Windows版)。
把DLL文件复制到系统目录是没意义的,别这么做。重命名它们更是完全没道理。你怎么会觉得这样能工作呢?每个库都是特定的,你不能仅仅通过重命名来改变它的内部工作方式。
我已经使用PushBullet一段时间了,所以我对这个Python脚本很感兴趣。我也用Cygwin很多年了。所以我安装了PushBullet库:
pip install pushbullet.py
然后我创建了一个非常简单的脚本test.py
:
#!/usr/bin/python
from pushbullet import PushBullet
pb = PushBullet('my_access_token')
success, push = pb.push_note("Testing title", "Hello world!")
当我用./test.py
执行它时,出现了一个错误信息,说我缺少magic
库,于是我通过Cygwin的安装工具安装了python-magic
库。
我再次执行它,结果就是——我在手机上收到了“Hello world!”的消息。完成。
再提醒一下:我是从Cygwin的shell中执行的(我用的是zsh,但你可能会用bash
),而不是从Windows控制台执行的。我也没有使用Windows版的Python,而是Cygwin的版本。不要混用Windows和Cygwin的可执行文件!
所以简单明了的步骤是:
- 从Cygwin.com下载并执行
setup.exe
- 安装
python
和python-magic
- 打开Cygwin的shell(你可以从开始菜单打开“Cygwin Terminal”,或者直接在“运行”对话框或Windows控制台中执行
C:\cygwin64\bin\bash.exe --login -i
) - 安装
pip
(可以参考Pip install not functioning on windows 7 Cygwin install) - 安装PushBullet库:
pip install pushbullet.py
- 准备你的测试脚本
- 执行它:
python testing_script.py
,或者如果脚本包含shebang行并且是可执行的,直接用testing_script.py
执行 - 应该可以工作,如果不行,请把你的错误信息发出来
谢谢你推荐这个有用的库 :)