💬

【Python】pycURL で HTTP/3 を利用するための環境構築

に公開

Chromebook で pycURL の HTTP/3 対応のための環境構築をしました。ChatGPT の力を借りた記事です。

前提環境

OS: Debian Bookworm (Chromebook、bookworm-backports を追加)

Python: uv による管理(Python 3.13.3)

curl: 手動ビルド版 (GnuTLS + HTTP/3 対応) を ~/.local にインストール

Debian の nookworm-backports のリポジトリでは curl は GunTLS (libcurl3-gnutls) に依存しており、HTTP/3 を使えるはずなのですが、手元の環境では OpenSSL のままだったので、curlおよび pycURL を自分でビルドする必要がありました。


  1. curl(GnuTLS + HTTP/3 対応)を ~/.local にビルド
CURL_VERSION=8.13.0
PREFIX="$HOME/.local"

sudo apt install -y \
  build-essential autoconf libtool pkg-config \
  libgnutls28-dev libnghttp3-dev libngtcp2-dev \
  libbrotli-dev libzstd-dev libidn2-dev libpsl-dev libev-dev

cd /tmp
wget https://curl.se/download/curl-${CURL_VERSION}.tar.xz
 tar -xf curl-${CURL_VERSION}.tar.xz
cd curl-${CURL_VERSION}

./configure --prefix="$PREFIX" \
  --with-gnutls \
  --with-nghttp3 \
  --with-ngtcp2 \
  --enable-alt-svc \
  --enable-http3

make -j$(nproc)
make install

確認:

~/.local/bin/curl -V

  1. libcurl の環境変数を設定(pycurl ビルド用)
export PYCURL_SSL_LIBRARY=gnutls
export LDFLAGS="-L$HOME/.local/lib"
export CPPFLAGS="-I$HOME/.local/include"
export PKG_CONFIG_PATH="$HOME/.local/lib/pkgconfig"
export LD_LIBRARY_PATH="$HOME/.local/lib:$LD_LIBRARY_PATH"
export PATH="$HOME/.local/bin:$PATH"

  1. pycurl をソースからビルドしてインストール
pip uninstall pycurl -y
uv pip install --no-binary=:all: --no-cache-dir -v pycurl

  1. 動作確認(REPL)
>>> import pycurl
>>> pycurl.version_info()
(11, '8.13.0', ..., 'GnuTLS/3.7.9', ..., ('http', 'https', ...))

備考

curl-config の出力は GnuTLS である必要がある(curl-config --ssl-backends)

pycurl の共有オブジェクトにリンクされる libcurl を確認するには:

ldd $(python -c "import pycurl, os; print(os.path.abspath(pycurl.__file__))") | grep libcurl

source や . による環境変数の永続化は .sh スクリプトでは不可視なので、対話型で実行するか env.sh を . ./env.sh で読み込む形式が確実

Discussion