从源代码构建Python3.7.3时缺少“_ctypes”

8
我正在尝试使用ensurepip从源代码构建Python-3.7.3,但我遇到了以下错误:
ModuleNotFoundError: No module named '_ctypes'

所有在线答案都说需要安装libffi-dev,但我已经安装了它,仍然出现这个错误。

root@4b6d672f1334:/Python-3.7.3# find / -name libffi.*
/usr/lib/pkgconfig/libffi.pc
/usr/lib/libffi.a
/usr/lib/libffi.so
/usr/lib/libffi.so.5.0.10
/usr/lib/libffi.so.5
/usr/share/info/libffi.info.gz

构建使用的是一个来自于ubuntu:10.04的容器镜像。 故意使用这么旧的版本是因为我正在使用PyInstaller编译应用程序,它需要在使用旧版glibc(2.11)的机器上运行,而这个镜像是我能找到的唯一一个有这个旧版本的镜像。 对于Python-2.7.16,我也做过同样的处理,没有出现任何问题。 更新 Python-3.6.8也没有出现任何问题。

3
我刚试着在 Lubuntu 18.04 上从源代码构建 Python 版本 3.7.3,但出现了“_ctypes”缺失的错误。我的解决方法是运行“sudo apt install libffi-dev”并重新构建。所以问题似乎与旧版 Ubuntu 有关。 - rdtsc
我也试过了,它在更新的Ubuntu版本上可以运行,但问题是我需要一个旧的glibc版本(2.11)来支持旧的发行版。 - Amir Rossert
3个回答

6

我能够在这里找到一个解决方案。

问题可能出在旧版本的libffi-dev上,解决方法是从源代码构建并安装libffi,然后再构建Python3.7.3。

构建libffi:

wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
tar xzf libffi-3.2.1.tar.gz
cd libffi-3.2.1
./configure --disable-docs
make
make install

构建Python 3.7.3:

wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
tar xzf Python-3.7.2.tgz && 
cd Python-3.7.2
export LD_LIBRARY_PATH=/usr/local/lib && \
export LD_RUN_PATH=/usr/local/lib && \
./configure --enable-optimizations --prefix=/usr/ --with-ensurepip=install --enable-shared LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I /usr/local/lib/libffi-3.2.1/include"
make
make install

请注意,这个命令:./configure --disable-docs 会引发警告,您需要下载更高版本的 libffi 才能通过 --disable-docs - donto

2
这是我在Debian 6.0.60上的解决方案,根据Amir Rossert的解决方案,非常感谢!
(1) 安装libffi。
tar zxf libffi-3.3.tar.gz
cd libffi-3.3
./configure
make
make install

(2) 安装 Python 3.8

tar zxf Python-3.8.5.tgz
cd Python-3.8.5
export LD_LIBRARY_PATH=/usr/local/lib && \
export LD_RUN_PATH=/usr/local/lib && \
./configure --prefix=/usr/local/python38 --with-openssl=/usr/local/openssl111 --enable-shared --enable-optimizations --with-system-ffi=/usr/local/lib/
make
make install

ln -s /usr/local/python38/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python38/bin/pip3 /usr/local/bin/pip3

touch /etc/ld.so.conf/python38.conf
echo "/usr/local/python38/lib" > /etc/ld.so.conf/python38.conf
ldconfig

好的,它运行良好。


1
在Ubuntu 10.04上的问题是来自libffi-dev中libffi.pc中的Cflags。以下修复措施可以解决问题,无需升级libffi软件包:
$ sed -i 's/Cflags:.*/Cflags: -I${includedir}\/x86_64-linux-gnu/' /usr/lib/pkgconfig/libffi.pc

以下是Dockerfile的内容,它在Ubuntu 10.04上构建Python 3.9.7版本:
FROM ubuntu:10.04

ARG PYVER=3.9.7

# Change to old-releases
RUN sed -i 's/http:\/\/archive.ubuntu.com\//http:\/\/old-releases.ubuntu.com\//' /etc/apt/sources.list

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    libreadline-dev libssl-dev zlib1g-dev libffi-dev \
    pkg-config build-essential

# Fix broken pkg-config for libffi (used by ctypes)
RUN sed -i 's/Cflags:.*/Cflags: -I${includedir}\/x86_64-linux-gnu/' /usr/lib/pkgconfig/libffi.pc

ADD https://www.python.org/ftp/python/$PYVER/Python-$PYVER.tgz /app/Python-$PYVER.tgz
RUN cd /app && tar zxvf Python-$PYVER.tgz && cd Python-$PYVER && \
    ./configure --prefix /opt/python3 && make && make install

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