如何使文件魔术模块在Alpine Linux上运行?

丹尼尔·奎因

我正在尝试在Alpine Linux上使用file-magic,并且AttributeError: Symbol not found: magic_open每当导入magic模块,它就会不断崩溃

我注意到那里有两个具有相同magic名称空间的Python模块,但是由于大多数Linux发行版似乎都在使用file-magic而不是python-magic,我决定让我的模块依赖于前者。但是,在Alpine上,仅python-magic起作用:

设置Alpine并安装libmagic:

$ 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

安装文件魔术:

/ # 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

但是它不起作用:

/ # 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:

$ 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

有用:

/ # 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容器以处理文件魔术?在这种情况下正确的做法是什么?

搅拌机

Python-Magic在Alpine Linux上一个硬编码的后备,因此您可能很难使用file-magic,它只是使用ctypes.util.find_library('magic')而显然找不到您的库。

确切的行为ctypes.util.find_library相当复杂的,但如果你跟踪通过代码,看看它会尝试将你的平台上使用该方法,你可能会找到一个方法来得到它找到库(可能是一个gcc/sbin/ldconfigobjdump)。

另一个解决方案是打补丁ctypes.py以正确处理Alpine等系统:

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可以找到该库:

/ # LD_LIBRARY_PATH="/usr/lib/" python -c "import ctypes.util; print(ctypes.util.find_library('magic'))"
libmagic.so.1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何查看服务是否在 Linux 上运行?

如何阻止时间在Linux上向后运行?

如何验证在Linux上运行的Cassandra?

如何调整Linux在闪存上可靠运行?

如何描述在Linux上运行的C ++代码?

如何安装Python在Linux上运行

在 Windows 上创建的 .sh 文件无法在 linux 上运行

Cron作业未在Kubernetes + Alpine Linux上运行

在 Alpine linux 上运行 ARA 服务器时出错

如何在Linux上运行独立的ijs j文件?

JavaFx Jar文件无法在Linux上运行(在Windows上运行良好)

如何使 Nunit 测试仅在 Linux 操作系统上运行(而不在 Windows 上运行)?

通过Linux上的.php通过.sh运行节点文件

为什么Windows EXE文件不能在Linux上运行?

在Linux中的所有文件上运行命令

可以在windows上运行用linux制作的exe文件吗

无法在Linux上运行Pyinstaller可执行文件

在Linux上运行时Serilog未创建日志文件

在html文件上运行linux应用程序

如何在 ubuntu 上运行我在 Windows for Linux 上使用 Visual Studio 编译的文件

如何使用AzurSQL同步在Linux上运行的SqlServerEdge

如何每秒在linux服务器上运行php脚本?

如何在PS3上运行Linux?

如何验证在Linux上运行的`getty`的真实性?

如何查找进程是否在Windows / Linux上运行

如何在Windows Server 2016上运行Linux Docker映像?

如何在Linux上启动时运行Bash脚本?

如何确保应用程序在Linux上保持运行

如何在不同的Linux系统上同时运行jar