繁体   English   中英

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

[英]Pushbullet on python throws import error due to python-magic unable to find 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 OR 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

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

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

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

我遇到了与python-magic相同的问题,并通过修复magic.py文件中的以下行来解决它(我的PC中的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存储库中解决

EDIT2:这是我在我的机器上运行PushBullet.py遵循的步骤:

  1. 安装PushBullet.py通过pippip install PushBullet.py );
  2. Cygwin安装libmagic ;
  3. C:\\cygwin\\bin\\PATH环境变量中;
  4. 像我上面解释的那样更改magic.py文件。 (就我而言,错误发生在第139行)

从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( 适用于Cygwin!而不是Windows版本 )的Pythonpython-magic

将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控制台。 我也没有使用Python for Windows而是使用Cygwin的版本。 不要混用Windows和Cygwin可执行文件!

所以愚蠢的步骤将是:

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

谢谢你提示有用的库:)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM