安装Python Shapely时发生阿尔卑斯错误

4
我需要将Shapely安装到基于Python+Alpine的Docker容器中。容器内已有以下内容:

make, gcc, geos-dev, musl-dev

通过这个命令,我获得了以下内容:pip install shapely


Collecting shapely
  Downloading https://files.pythonhosted.org/packages/a2/fb/7a7af9ef7a35d16fa23b127abee272cfc483ca89029b73e92e93cdf36e6b/Shapely-1.6.4.post2.tar.gz (225kB)
     |████████████████████████████████| 235kB 641kB/s 
    ERROR: Command errored out with exit status 1:
     command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-vj51jvsy/shapely/setup.py'"'"'; __file__='"'"'/tmp/pip-install-vj51jvsy/shapely/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-vj51jvsy/shapely/pip-egg-info
         cwd: /tmp/pip-install-vj51jvsy/shapely/
    Complete output (11 lines):
    Failed `CDLL(libgeos_c.so.1)`
    Failed `CDLL(libgeos_c.so)`
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-vj51jvsy/shapely/setup.py", line 80, in <module>
        from shapely._buildcfg import geos_version_string, geos_version, \
      File "/tmp/pip-install-vj51jvsy/shapely/shapely/_buildcfg.py", line 167, in <module>
        fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
      File "/tmp/pip-install-vj51jvsy/shapely/shapely/_buildcfg.py", line 161, in load_dll
        libname, fallbacks or []))
    OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so']
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

我搜索了很多次,但找不到任何解决方案。

Dockerfile

FROM python:3.7-alpine

RUN ["mkdir", "/home/test"]
WORKDIR /home/test

RUN echo "http://mirror.leaseweb.com/alpine/edge/testing" >> /etc/apk/repositories
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN ["apk", "add", "make", "gcc", "geos-dev", "musl-dev"]
RUN ["pip3", "install", "virtualenv", "--no-warn-script-location", "--disable-pip-version-check"]
RUN ["virtualenv", ".env", "--python=python3"]
RUN ["pip3", "install", "shapely"]

CMD ["/bin/sh"]

容器内 Python 的版本

/home/test # /usr/local/bin/python
Python 3.7.5 (default, Oct 21 2019, 20:13:45) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

GEOS 版本

/home/test # geos-config --version
3.7.2

已更新

现在你必须将此仓库放在其他仓库下方:

--repository http://dl-cdn.alpinelinux.org/alpine/edge/community

2
你能把你的 Dockerfile 添加到问题中吗?这类错误信息通常意味着你缺少一个开发包。 - David Maze
1
你使用的是哪个版本的Python?/usr/local/bin/python - EchoMike444
1
你需要确保 GEOS 的版本号大于等于 3.3。 - LinPy
我根据您的指导更新了我的问题描述。@DavidMaze - lovesuper
2个回答

3
这个可以工作:
FROM python:3.7-alpine

RUN ["mkdir", "/home/test"]
WORKDIR /home/test

RUN echo "http://mirror.leaseweb.com/alpine/edge/community" >> /etc/apk/repositories
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk add --virtual .build-deps \
        --repository http://dl-cdn.alpinelinux.org/alpine/edge/community \
        --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
        gcc libc-dev geos-dev geos && \
    runDeps="$(scanelf --needed --nobanner --recursive /usr/local \
    | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
    | xargs -r apk info --installed \
    | sort -u)" && \
    apk add --virtual .rundeps $runDeps
RUN ["pip", "install", "shapely"]

CMD ["/bin/sh"]

请看这里

更新: 根据评论,geos-dev已经迁移到了community仓库。


谢谢。你真是个天才!你帮我节省了很多时间。 - lovesuper
@lovesuper 这对你有何作用?看起来边缘仓库上的最新版 geos 与 shapely 不兼容。我们的构建也因为同样的错误停止工作了。 - Hien
runDeps="$(scanelf --needed --nobanner --recursive /usr/local
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }'
| xargs -r apk info --installed
| sort -u)" && \这段代码的意思是什么?
- varnothing
1
将提取所需的库以进行安装,列表为 expat gdbm libbz2 libcrypto1.1 libffi libnsl libssl1.1 libtirpc libuuid musl ncurses-libs readline sqlite-libs xz-libs zlib - LinPy
geos-dev已从测试存储库移至社区。但这并没有解决我的问题。我不得不切换到Debian镜像。 - varnothing

1
我也遇到了这个构建问题。我的解决方案是从Alpine切换到Debian(虽然不是理想的,但它允许我使用较旧版本的geos),因为最新版本的geos似乎与shapely不兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接