首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让文件魔术模块在高山Linux上工作?

如何让文件魔术模块在高山Linux上工作?
EN

Stack Overflow用户
提问于 2018-12-27 03:47:19
回答 1查看 1.6K关注 0票数 1

我正试图在高山Linux上使用文件魔术,但每当我导入magic模块时,它就会一直在AttributeError: Symbol not found: magic_open上崩溃。

我注意到有两个Python模块使用相同的magic名称空间,但由于大多数Linux发行版似乎都使用file-magic而不是python-magic,所以我决定让我的模块依赖于前者。然而,在阿尔卑斯山上,似乎只有python-magic可以工作:

设置高山&安装libmagic:

代码语言:javascript
复制
$ docker run --rm -it python:3-alpine /bin/sh
/ # apk add libmagic
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing libmagic (5.32-r0)
OK: 21 MiB in 35 packages

安装文件-魔术:

代码语言:javascript
复制
/ # pip install file-magic
Collecting file-magic
  Downloading https://files.pythonhosted.org/packages/bb/7e/b256e53a6558afd348387c3119dc4a1e3003d36030584a427168c8d72a7a/file_magic-0.4.0-py3-none-any.whl
Installing collected packages: file-magic
Successfully installed file-magic-0.4.0

但是它不能工作:

代码语言:javascript
复制
/ # python
Python 3.7.1 (default, Dec 21 2018, 03:21:42) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import magic
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/magic.py", line 61, in <module>
    _open = _libraries['magic'].magic_open
  File "/usr/local/lib/python3.7/ctypes/__init__.py", line 369, in __getattr__
    func = self.__getitem__(name)
  File "/usr/local/lib/python3.7/ctypes/__init__.py", line 374, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: Symbol not found: magic_open
>>> 

用python-magic替换file-magic:

代码语言:javascript
复制
$ pip uninstall file-magic
Uninstalling file-magic-0.4.0:
  Would remove:
    /usr/local/lib/python3.7/site-packages/file_magic-0.4.0.dist-info/*
    /usr/local/lib/python3.7/site-packages/magic.py
Proceed (y/n)? y
  Successfully uninstalled file-magic-0.4.0

/ # pip install python-magic
Collecting python-magic
  Downloading https://files.pythonhosted.org/packages/42/a1/76d30c79992e3750dac6790ce16f056f870d368ba142f83f75f694d93001/python_magic-0.4.15-py2.py3-none-any.whl
Installing collected packages: python-magic
Successfully installed python-magic-0.4.15

它是有效的:

代码语言:javascript
复制
/ # python
Python 3.7.1 (default, Dec 21 2018, 03:21:42) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import magic
>>> 

我知道每个发行版都有它的怪癖,我想要适应,但我现在不知道该怎么做。有没有办法定义一个模块的setup.py来解决这个问题呢?有没有办法调整Docker容器以使用文件魔术?在这种情况下,正确的做法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-27 04:17:09

Python-Magic提供了针对高山Linux的a hard-coded fallback,所以你可能很难使用文件魔术,它只使用ctypes.util.find_library('magic'),显然找不到你的库。

ctypes.util.find_library的确切行为是pretty complicated,但是如果您跟踪代码,看看它试图在您的平台上使用哪些方法,您可能会找到一种方法,让它找到这个库(可能是gcc/sbin/ldconfigobjdump中的一个)。

另一种解决方案是为ctypes.py打补丁,以正确处理类似于阿尔卑斯山的系统:

代码语言:javascript
复制
wget https://patch-diff.githubusercontent.com/raw/python/cpython/pull/10461.patch -O - | patch /usr/local/lib/python3.7/ctypes/util.py

现在你只需要设置LD_LIBRARY_PATH,Python就可以找到这个库了:

代码语言:javascript
复制
/ # LD_LIBRARY_PATH="/usr/lib/" python -c "import ctypes.util; print(ctypes.util.find_library('magic'))"
libmagic.so.1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53936467

复制
相关文章

相似问题

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