1

我正在尝试使用PushBullet.pywhich uses python-magicwhich 又使用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

编辑

如果我将OR放入并将其重命名为,则会收到以下错误:cygmagic-1.dll cygz.dllC:\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

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

有谁知道如何解决这个问题?

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

4

3 回答 3

2

我对 python-magic 有同样的问题,并通过修复magic.py文件中的以下行(C:\Python27\lib\site-packages\magic.py在我的 PC 中)来解决它:

dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1')

因为我libmagic是从 Cygwin 安装的,所以 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 存储库中得到解决。

EDIT2: 这些是我在我的机器上进行PushBullet.py工作所遵循的步骤:

  1. PushBullet.py通过pip( )安装pip install PushBullet.py
  2. libmagicCygwin安装;
  3. 添加C:\cygwin\bin\PATH环境变量;
  4. magic.py按照我上面的解释更改文件。(在我的情况下,错误在第 139 行)
于 2014-09-12T18:41:05.207 回答
1

从您的回溯清单中的 Windows 路径,我猜您正在尝试从 Windows 版本的 Python 执行 PushBullet 脚本。如果您不使用 Cygwin,为什么要安装它?Python for Windows 真的不会使用 Cygwin 的 DLL。

您必须PushBullet.py使用 Cygwin 的 Python 从 Cygwin 执行,而不是使用 Windows 的 Python 从 Windows 控制台执行。这意味着执行例如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库,所以我python-magic使用 Cygwin 的安装实用程序安装了库。

我再次执行它,瞧 - 我有“Hello world!” 我手机上的消息。完毕。

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

因此,愚蠢的步骤将是:

  1. setup.exeCygwin.com下载并执行
  2. 安装pythonpython-magic
  3. 执行 Cygwin 的 shell(您可以从“开始”菜单执行“Cygwin 终端”,或者仅从C:\cygwin64\bin\bash.exe --login -i“运行”对话框或 Windows 控制台执行)
  4. 安装pip(例如,请参阅Pip 安装在 Windows 7 Cygwin 安装上不起作用
  5. 安装PushBullet库:pip install pushbullet.py
  6. 准备你的测试脚本
  7. 执行它:python testing_script.py或者只是testing_script.py它包含 shebang 行并且是可执行的
  8. 它应该可以工作,如果没有,请发布您的错误

感谢您提供有用库的提示:)

于 2014-08-26T19:21:12.203 回答
0

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

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

于 2014-08-15T15:09:18.810 回答