由于python-magic无法找到libmagic,python上的pushbullet会引发导入错误?

时间:2014-08-15 14:18:46

标签: python python-2.7 cygwin ipython-magic libmagic

我正在尝试使用使用PushBullet.pypython-magicdependencies又使用libmagic

我已按照{{3}}说明安装了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\并将其重命名为{{ 1}}我收到以下错误:

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

我在Windows 7 64bit上运行Python 32bit 2.7.8(今天全新安装以尝试解决此问题)。

有谁知道如何解决问题?

编辑:尝试了另外5台不同的Windows计算机,所有5台计算机都有相同的问题。

3 个答案:

答案 0 :(得分: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 repository已解决了这个问题。

<强> EDIT2: 这些是我在我的机器上使PushBullet.py工作的步骤:

  1. 通过PushBullet.pypip);
  2. 安装pip install PushBullet.py
  3. Cygwin;
  4. 安装libmagic
  5. C:\cygwin\bin\添加到PATH环境变量;
  6. 更改magic.py文件,如上所述。 (就我而言,错误发生在第139行)

答案 1 :(得分:1)

从traceback列表中的Windows路径,我猜你正在尝试从Windows版本的Python执行PushBullet脚本。如果不使用Cygwin,为什么要安装? Python for Windows确实不会使用Cygwin的DLL。

您必须使用Python for Cygwin从Cygwin执行PushBullet.py,而不是使用Python for Windows从Windows控制台执行。这意味着执行例如bash(类似于C:\cygwin64\bin\bash.exe --login -i)和bash执行PushBullet脚本:python PushBullet.py

它预计,已经安装了Cygwin( for Cygwin!不是Windows版)的 Python python-magic

将DLL复制到系统目录是无稽之谈,不要这样做。重命名它们是 uber -nonsense。您是如何期望它可以工作的?每个库都是特定的,您只需将其重命名即可更改其内部工作方式。

我已经使用了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

我再次执行它并且瞧 - 我有#34; Hello world!&#34;我手机上的留言。完成。

再说一遍:我已经从Cygwin的shell中执行了它(zsh,但我猜你会bash),而不是来自Windows控制台。我也没有使用Python for Windows而是使用Cygwin的版本。 不要混用Windows和Cygwin可执行文件!

所以愚蠢的步骤将是:

  1. Cygwin.com
  2. 下载并执行setup.exe
  3. 安装pythonpython-magic
  4. 执行Cygwin的shell(您可以从开始菜单执行&#34; Cygwin Terminal&#34;或者只是执行C:\cygwin64\bin\bash.exe --login -i,例如从&#34;运行&#34;对话框或Windows控制台)
  5. 安装pip(例如参见Pip install not functioning on windows 7 Cygwin install
  6. 安装 PushBullet 库:pip install pushbullet.py
  7. 准备测试脚本
  8. 执行它:python testing_script.py或仅testing_script.py如果它包含shebang行且可执行
  9. 它应该有效,如果没有,请发布您的错误,
  10. 感谢您提供有用库的提示:)

答案 2 :(得分:0)

您不能混用Cygwin和MSVCRT二进制文件。因此,为了在Windows Python中使用python-magic,你必须得到一个Windows编译的libmagic并修复magic.py才能找到libmagic DLL。

否则,如果你想按原样使用Cygwin的python-magic,你需要使用Cygwin的python包。