Python中的Pushbullet因python-magic无法找到libmagic而抛出导入错误?

1 投票
3 回答
2924 浏览
提问于 2025-04-18 17:24

我正在尝试使用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 个回答

0

你不能把Cygwin和MSVCRT的程序混在一起用。因此,如果你想在Windows上用python-magic,就得找一个专门为Windows编译的libmagic,并且要修改magic.py文件,让它能找到这个libmagic的DLL文件。

如果你想直接使用Cygwin的python-magic,那就得用Cygwin的Python包。

2

我之前也遇到过和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正常工作的步骤:

  1. 通过pip安装PushBullet.py(命令是pip install PushBullet.py);
  2. Cygwin安装libmagic
  3. C:\cygwin\bin\添加到PATH环境变量里;
  4. 按照我上面说的修改magic.py文件。(在我这儿,错误出现在第139行)
1

从你错误信息中的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版的Pythonpython-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的可执行文件!

所以简单明了的步骤是:

  1. Cygwin.com下载并执行setup.exe
  2. 安装pythonpython-magic
  3. 打开Cygwin的shell(你可以从开始菜单打开“Cygwin Terminal”,或者直接在“运行”对话框或Windows控制台中执行C:\cygwin64\bin\bash.exe --login -i
  4. 安装pip(可以参考Pip install not functioning on windows 7 Cygwin install
  5. 安装PushBullet库:pip install pushbullet.py
  6. 准备你的测试脚本
  7. 执行它:python testing_script.py,或者如果脚本包含shebang行并且是可执行的,直接用testing_script.py执行
  8. 应该可以工作,如果不行,请把你的错误信息发出来

谢谢你推荐这个有用的库 :)

撰写回答