首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >因为python -魔术无法找到libmagic而抛出导入错误?

因为python -魔术无法找到libmagic而抛出导入错误?
EN

Stack Overflow用户
提问于 2014-08-15 14:18:45
回答 3查看 2.7K关注 0票数 1

我尝试使用PushBullet.py,它使用python-magic,而后者又使用libmagic

我已经按照依赖关系指令安装了Cygwin,并将这三个文件复制到Windows\system32目录中,但仍然收到以下错误:

代码语言:javascript
复制
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,则会得到以下错误:

代码语言:javascript
复制
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,则会得到以下错误:

代码语言:javascript
复制
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

我正在运行Python32bit 2.7.8的Windows 7 64位上执行此操作(为了解决这个问题,请立即重新安装)。

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

编辑:在另外5台不同的windows计算机上试用,所有5台都有相同的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-26 19:21:12

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

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

它期望你有Python和python(代表Cygwin!)而不是已经安装的Windows )。

将DLL复制到系统目录是无稽之谈,不要这样做。重新命名他们是胡说八道。你以为它能起作用吗?每个库都是特定的,您不能仅仅重命名它以改变它内部的工作方式。

我已经使用PushBullet一段时间了,所以我对这个特定的Python脚本很感兴趣。我也用了几年的Cygwin。所以我安装了PushBullet库:

pip install pushbullet.py

然后我创建了非常简单的脚本test.py

代码语言:javascript
复制
#!/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库。

我又执行了一次,瞧--我有“你好世界!”我手机上的留言。好了。

请再说一遍:我是从Cygwin的shell (zsh,但我猜是bash )执行的,而不是从Windows执行的。我也没有在Windows上使用Python,但是使用了Cygwin的版本。不要混合Windows和Cygwin可执行文件!

所以防不胜防的步骤是:

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

谢谢您对有用库的提示:)

票数 1
EN

Stack Overflow用户

发布于 2014-09-12 18:41:05

我在python-魔术方面也遇到了同样的问题,并通过修复magic.py文件中的以下行(我的PC中的C:\Python27\lib\site-packages\magic.py)来解决这个问题:

代码语言:javascript
复制
dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1')

因为我已经从Cygwin安装了libmagic,所以这个DLL被命名为cygmagic-1.dll。因此,我简单地在前一行中添加了另一个选项:

代码语言:javascript
复制
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. libmagic安装西格温
  3. C:\cygwin\bin\添加到PATH环境变量;
  4. 正如我前面所解释的,更改magic.py文件。(在我的例子中,错误出现在第139行)
票数 2
EN

Stack Overflow用户

发布于 2014-08-15 15:09:18

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

否则,如果您想像以前一样使用Cygwin的python --魔术,则需要使用Cygwin的python包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25328104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档