🧮

AtCoder Python + Pypy Docker 環境

2024/03/08に公開

背景

自身の備忘録&初学者の方の参考に私が使っている AtCoder の Python 環境を公開しておきます。

Dockerfile

Docker で Python や PyPy をインストールし利用できるようにしています。
昔は C++ や Rust も含めていましたが一旦外しています。

また、シェルは zsh を利用しています。

# PyPy の公式コンテナを利用する
FROM pypy:3.10-7.3.12

# インタラクティブモードにならないようにする
ENV DEBIAN_FRONTEND=noninteractive

# タイムゾーンを日本に設定
ENV TZ=Asia/Tokyo

# 解凍されたパッケージを設定する時にユーザとの対話をしないようにする
ENV DEBCONF_NONINTERACTIVE_SEEN=true

# インフラを整備
RUN apt-get update \
    && apt-get --no-install-recommends install -y \
    zsh \
    time \
    tzdata \
    tree \
    git \
    curl \
    wget \
    bzip2 \
    gcc \
    g++ \
    gfortran \
    libopenblas-dev \
    liblapack-dev \
    pkg-config \
    libgeos-dev \
    nodejs \
    npm \
    clang \
    dirmngr \
    ca-certificates \
    software-properties-common \
    apt-transport-https \
    ruby-full \
    build-essential gdb lcov \
    libbz2-dev \
    libffi-dev \
    libgdbm-dev \
    libgdbm-compat-dev \
    liblzma-dev \
    libncurses5-dev \
    libreadline6-dev \
    libsqlite3-dev \
    libssl-dev \
    lzma \
    lzma-dev \
    tk-dev \
    uuid-dev \
    zlib1g-dev

# デフォルトシェルを zsh にする
RUN chsh -s /bin/zsh
WORKDIR /tmp

# Install pypy3 and its packages
RUN pypy -m pip install --break-system-packages \
    numpy==1.24.1 \
    scipy==1.10.1 \
    networkx==3.0 \
    sympy==1.11.1 \
    sortedcontainers==2.4.0 \
    more-itertools==9.0.0 \
    shapely==2.0.0 \
    bitarray==2.6.2 \
    PuLP==2.7.0 \
    mpmath==1.2.1 \
    pandas==1.5.2 \
    z3-solver==4.12.1.0 \
    scikit-learn==1.3.0 \
    typing-extensions==4.4.0 \
    git+https://github.com/not522/ac-library-python

# Install pyenv, python3.11 and its packages
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv && \
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc && \
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc && \
    echo 'eval "$(pyenv init -)"' >> ~/.zshrc && \
    . ~/.zshrc \
    && pyenv install 3.11.4 \
    && pyenv global 3.11.4 \
    && pip install --no-cache-dir pip==23.2.1 setuptools==66.0.0 \
    && pip install --no-cache-dir \
    numpy==1.24.1 \
    scipy==1.10.1 \
    networkx==3.0 \
    sympy==1.11.1 \
    sortedcontainers==2.4.0  \
    more-itertools==9.0.0 \
    shapely==2.0.0 \
    bitarray==2.6.2 \
    PuLP==2.7.0 \
    mpmath==1.2.1 \
    pandas==1.5.2 \
    z3-solver==4.12.1.0 \
    scikit-learn==1.2.0 \
    ortools==9.5.2237 \
    polars==0.15.15 \
    lightgbm==3.3.1 \
    numba==0.57.0 \
    git+https://github.com/not522/ac-library-python

# torch==1.13.1 インストールができなかったのでインストール対象外にしています

# コンテスト補助アプリケーションをインストール
RUN pip install online-judge-tools \
    && npm install -g atcoder-cli
WORKDIR /root/workspace

devcontainer

VSCode の devcontainer で利用するために例えば atcoder など適当なディレクトリを作成してください。

mkdir atcoder # 適宜変更してください
cd atcoder

以下のディレクトリ構成で devcontainer.json を作成します。

tree . -a
├── .devcontainer
│   └── devcontainer.json
└── Dockerfile
devcontainer.json
{
    "name": "${localWorkspaceFolderBasename}",
    "build": {
        "dockerfile": "../Dockerfile"
    },
    "customizations": {
        "vscode": {
            "settings": {
                "extensions.verifySignature": false,
                "terminal.integrated.defaultProfile.linux": "zsh",
                "terminal.integrated.profiles.linux": {
                    "bash": {
                        "path": "/usr/bin/zsh",
                        "args": [
                            "-l"
                        ]
                    }
                }
            },
            "extensions": [
                "ms-python.python",
                "ms-python.vscode-pylance"
                # あらかじめインストールしたい Extension を記載してください。後から追加でインストールも可能です。
            ]
        }
    }
}

devcontainer をコマンドパレットなどから起動しましょう。
初回時のみ docker build が行われるので起動に時間がかかります。

Python および PyPy の確認

ターミナルで Python および PyPy のバージョンを確認してください。

$ python -V                         
Python 3.11.4

$ pypy -V                         
Python 3.10.12 (af44d0b8114cb82c40a07bb9ee9c1ca8a1b3688c, Jun 15 2023, 12:39:27)
[PyPy 7.3.12 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]

AtCoder で利用可能な PyPy と Python のバージョンを同居させるために Python は pyenv と呼ばれるバージョン管理ツールを利用してインストールしています。
/root/.pyenv/shims/python に PATH が通っていない場合はデフォルトの Python が使われてしまうので type コマンドなどで /root/.pyenv/shims/python が優先しているか確認してください。

$ type python      
python is /root/.pyenv/shims/python

/root/.pyenv/shims/python に PATH が通っていない理由の一つとして自身で .zshrc をカスタマイズした時に以下のコマンドを記載し忘れているのが原因の一つだと考えられます。

.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

また、アルゴリズム部門、ヒューリスティック部門で用いるライブラリはほぼ利用可能です。
一部 docker build を実行してもいつまでたってもインストールできなく断念したらライブラリがありますが、どのようなライブラリか確認したところアルゴリズム部門では必須という感じではなかったです。

$ python   
Python 3.11.4 (main, Feb  2 2024, 02:38:43) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from atcoder.segtree import SegTree

$ pypy   
Python 3.10.12 (af44d0b8114cb82c40a07bb9ee9c1ca8a1b3688c, Jun 15 2023, 12:39:27)
[PyPy 7.3.12 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>> from atcoder.segtree import SegTree

コード実装時にインストールしているはずのライブラリに関する関数などのサジェストが出てこなかったり、そのようなライブラリはインストールされていませんという注意が出る場合は VSCode のコード実装時に利用する Python が /root/.pyenv/shims/python になっていない可能性があります。
VSCode の右下が「3.11.4 64-bit ('3.11.4': pyenv)」となっている確認してください。

違う場合はクリックすることで変更することができます。

online-judge-tools, atcoder-cli

コンテスト補助アプリケーションをインストールとして online-judge-toolsatcoder-cli をインストールしています。

利用する場合は初回時のみ自身の ID とパスワードでログインするようにしてください。

$ oj login https://atcoder.jp
[INFO] GET: https://pypi.org/pypi/online-judge-tools/json
[INFO] 200 OK
[INFO] GET: https://pypi.org/pypi/online-judge-api-client/json
[INFO] 200 OK
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] load cookie from: /workspaces/atcoder/online-judge-tools/cookie.jar
[NETWORK] GET: https://atcoder.jp/contests/agc001/submit
[NETWORK] 302 Found
[FAILURE] You are not signed in.
[ERROR] Selenium is not installed. Please run $ pip3 install selenium
[WARNING] Switch to use CUI-based login instead of Selenium
[NETWORK] GET: https://atcoder.jp/contests/agc001/submit
[NETWORK] 302 Found
[NETWORK] GET: https://atcoder.jp/login
[NETWORK] 200 OK
[WARNING] AtCoder says: × Please sign in first.
Username: yamasaKit  # 自身の AtCoder での ID を入れてください
Password:  # 自身の AtCoder でのパスワードを入れてください
[NETWORK] POST: https://atcoder.jp/login
[NETWORK] redirected to: https://atcoder.jp/home
[NETWORK] 200 OK
[WARNING] AtCoder says: × Welcome, yamasaKit.
[INFO] Welcome,
[NETWORK] GET: https://atcoder.jp/contests/agc001/submit
[NETWORK] 200 OK
[SUCCESS] You have already signed in.
[INFO] save cookie to: /workspaces/atcoder/online-judge-tools/cookie.jar
$ acc login
? username: yamasaKit  # 自身の AtCoder での ID を入れてください
? password: [input is hidden]  # 自身の AtCoder でのパスワードを入れてください
OK

詳細な使い方は公式ドキュメントを読んでいただけたらわかりますが atcoder-cli はコンテストのサンプルのダウンロードやコードの提出、 online-judge-tools はサンプル出力例とコードの出力が一致するかのテストなどを行えます。

$ acc new --choice all abc342  # abc342 という名前のディレクトリに abc342 のサンプルのダウンロードを行う
$ cd abc342/a
$ touch main.py
# 実装後
oj test -d tests -c "python main.py"  # main.py のテストを行う
$ oj t -d tests -c "python main.py"
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] 3 cases found

[INFO] sample-1
[INFO] time: 0.238385 sec
[SUCCESS] AC

[INFO] sample-2
[INFO] time: 0.185776 sec
[SUCCESS] AC

[INFO] sample-3
[INFO] time: 0.171432 sec
[SUCCESS] AC

[INFO] slowest: 0.238385 sec  (for sample-1)
[INFO] max memory: 12.080000 MB  (for sample-2)
[SUCCESS] test success: 3 cases

また online-judge-tools は他にもインタラクティブ問題を解く時のサーバの起動も行えます。
詳細は私の別の記事をご覧ください。

https://zenn.dev/yamasakit/articles/6c224967e9bf87

💡 まとめ

  • Python, PyPy を同時に利用できる docker 環境を作りました
  • AtCoder で一般的によく使うライブラリをインストールしています
  • online-judge-tools, atcoder-cli もすぐに利用可能です

ぜひ有効利用してください。

Discussion