Open7

Python開発環境の構築

星野 仁星野 仁

目標

PyPiで提供するPythonモジュールを開発するプロジェクトの開発環境を構築する。

要件

  • なるべく最新のデファクトツールを利用する
  • 複数の開発者で環境を共通化できる
星野 仁星野 仁

パッケージインストール

開発環境に依存するパッケージは以下のようにインストールする

rye add --dev [myproject] --git=https://github.com/[organization]/[myproject].git --branch dev

パッケージを更新する場合は

rye sync
星野 仁星野 仁

RyeのPublishエラー

エラー内容

importlib-metadata によりエラー

確認方法

エラー確認方法
$ ~/.rye/self/bin/twine --version
Traceback (most recent call last):
  File "/home/vscode/.rye/self/bin/twine", line 5, in <module>
    from twine.__main__ import main
  File "/home/vscode/.rye/self/lib/python3.12/site-packages/twine/__init__.py", line 43, in <module>
    __license__ = metadata["license"]
                  ~~~~~~~~^^^^^^^^^^^
  File "/home/vscode/.rye/self/lib/python3.12/site-packages/importlib_metadata/_adapters.py", line 54, in __getitem__
    raise KeyError(item)
KeyError: 'license'
エラー時のバージョン
$ rye --version
rye 0.35.0
commit: 0.35.0 (a1dbc56d4 2024-06-24)
platform: linux (aarch64)
self-python: cpython@3.12.3
symlink support: true
uv enabled: true

$ rye run twine --version
twine version 5.0.0 (importlib-metadata: 8.0.0, keyring: 25.2.1, pkginfo: 1.11.1, requests: 2.32.3, requests-toolbelt: 1.0.0, urllib3: 2.2.2)

回避方法

ローカルにtwineの5.1.1 をインストールし、ryeの組み込みではなくそちらを使ってアップロードする。

twineインストール
$ rye add -d twine==5.1.1
TestPyPIにアップロード
$ rye run twine upload -r testpipy --repository-url https://test.pypi.org/legacy/ dist/*
星野 仁星野 仁

開発環境のタイムゾーンの設定

他の利用者を考えるとコンテナのタイムゾーンを固定化したくないので、とりあえずコンテナ毎に以下を実施する。

echo export TZ=Asia/Tokyo >> ~/.bashrc
星野 仁星野 仁

GitHub Actionsの追加

rye を使っているのでインストールして全てをryeで実施。

.github/workflows/python-check.yml
name: Python test and lint

on:
  push:
    branches: [ "dev", "main" ]
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout the repository
      uses: actions/checkout@v4
    - name: Install the latest version of rye
      run: |
        curl -sSf https://rye.astral.sh/get | RYE_INSTALL_OPTION="--yes" bash
        echo "$HOME/.rye/shims" >> $GITHUB_PATH
    - name: Sync environment with rye
      run: rye sync
    - name: Lint with ruff
      run: rye lint
    - name: Test with pytest
      run: rye test