在 python docker 映像上安装 simstring (SWIG)

Posted

技术标签:

【中文标题】在 python docker 映像上安装 simstring (SWIG)【英文标题】:installing simstring (SWIG) on python docker image 【发布时间】:2019-11-13 08:47:58 【问题描述】:

我正在尝试在 python docker 映像(python:latest 或 python:3.7)上安装 C++ 包 simstring

我采取的步骤是,按照 repo 中的说明/我已经能够收集到的内容:

docker run -it python:latest /bin/bash
autoconf -i
apt-get install swig
git clone https://github.com/chokkan/simstring.git
cd simstring
./configure
cd swig/python
./prepare.sh --swig
python setup build_ext

这是我得到两个错误的地方:

/usr/bin/ld: cannot find -liconv
/usr/bin/ld: cannot find -lpython

不知何故,我需要将它们的位置传递给 build_ext 左右,但我找不到要链接的文件,也找不到如何链接它们。有任何想法吗? (Simstring-pure,不幸的是,python 包不是一个选项。)

更新

根据下面的优秀答案构建 docker 映像后,我进入下一个障碍,看起来仍然找不到 iconv。顺便说一句,在 3.7 python 中,这甚至无法构建。不过3.8就好了。

docker run -it simstring
Python 3.8.0 (default, Oct 17 2019, 05:36:36)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import simstring
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/simstring.py", line 14, in swig_import_helper
    return importlib.import_module(mname)
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 657, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 556, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 1101, in create_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: libiconv.so.2: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/simstring.py", line 17, in <module>
    _simstring = swig_import_helper()
  File "/usr/local/lib/python3.8/site-packages/simstring.py", line 16, in swig_import_helper
    return importlib.import_module('_simstring')
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: libiconv.so.2: cannot open shared object file: No such file or directory

【问题讨论】:

如果有人想知道,对于 10k 个条目的列表,与 simstring-pure 相比,速度提升大约是 20 倍。 【参考方案1】:

你可以使用这个 Dockerfile:

FROM python:3.8
RUN wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz \
    && tar -xvzf libiconv-1.16.tar.gz \
    && cd libiconv-1.16 \
    && ./configure --prefix=/usr/local/lib \
    && make \
    && make install \
    && cd /usr/local/lib \
    && ln -s lib/libiconv.so libiconv.so \
    && ln -s libpython3.8.so.1.0 libpython.so \
    && ln -s lib/libiconv.so.2 libiconv.so.2

RUN apt-get update && apt-get install -y swig vim
RUN git clone https://github.com/chokkan/simstring.git
RUN cd simstring \
    && autoreconf -i \
    && ./configure \
    && cd swig/python \
    && ./prepare.sh --swig \
    && python setup.py build_ext \
    && python setup.py install

最后结果:

byte-compiling /usr/local/lib/python3.8/site-packages/simstring.py to simstring.cpython-38.pyc
running install_egg_info
Writing /usr/local/lib/python3.8/site-packages/simstring-1.1-py3.8.egg-info

【讨论】:

这是一个很好的开始,但根据更新后的问题,我仍然收到错误。 它使图像正常。 (最后用 CMD python 和docker build -t simstring .)但是由于找不到libiconv.so.2,使用包失败。 查看更新,现在可以使用了,请照原样复制文件 注意:如果你想使用python3.7,这一行`ln -s libpython3.8.so.1.0 libpython.so`是不同的 由于使用了libpython3.8FROM python:3.8,否则会抛出错误。

以上是关于在 python docker 映像上安装 simstring (SWIG)的主要内容,如果未能解决你的问题,请参考以下文章

为 Python 项目构建 Docker 映像时如何避免重新安装包?

如何在 Azure 上安装元数据库 docker 映像

在 Debian 拉伸 Docker 映像上安装保险丝时遇到问题

在 slim python 3.6 docker 映像上运行 python mysql 客户端

如何在 docker 映像中安装 python 模块?

在windows上安装ASP.NET Core 的 Docker 映像