Python Monthly Topics

CPythonコントリビュートのはじめかた

福田@JunyaFffです。今月の「Python Monthly Topics」は、CPythonコントリビュート(貢献)のはじめかたという内容でお送りします。

はじめに

OSSへの貢献、とくに普段利用しているOSSにコントリビュートしたいという願望は多くの方にあるのではないでしょうか。わたし自身、OSSへのコントリビュートを実践するエンジニアに憧れを持っていますが、なかなか一歩を踏み出せていませんでした。そんな中、今年参加したEuroPython 2023というヨーロッパのPythonイベントのスプリント [1] で、はじめてCPythonへのコントリビュートの機会を得ました。内容はとても小さなドキュメントの修正でしたが、実際に経験できたことはとても嬉しかったです。⁠どうやったらいいの?」という方の参考になればと思い、体験談とコントリビュートの具体的な流れを紹介します。

CPythonへのPull Request(PR)
CPythonへのPR

ご参考までに、わたしの小さなPRはこちらになります。

ドキュメントの充実と簡単なチャレンジから

Pythonは開発者向けドキュメントが非常に充実しています。少しでもOSSへのコミットをした経験がある方ならば、これらのドキュメントを読めばコントリビュートの流れがわかるようになっています。本記事では、どなたでもチャレンジできるように要点をまとめ、Issueの中でも「Easy」⁠good first issue」といったラベルのついている、取り組みやすい課題への挑戦の手助けを目指します。

本記事は、2023年10月現在の情報をもとに執筆しています。内容は変更される可能性がありますので、最新およびより詳細な情報は開発者向けドキュメントの「Python Developer’s Guide」をご参照ください。

CPythonへのコントリビュートのきっかけ

前述の通り、わたしはEuroPython 2023でのスプリントにて、はじめてCPythonへのコントリビュートを行いました。

EuroPython 2023では、さまざまなスプリントが実施されました。参加方法はとても簡単で今回の場合、スプリントの当日現地に行くだけでした。カンファレンスのチケットを持っていれば、誰でもスプリントに参加可能です。わたしは、⁠CPython Core (work on Python 3.13!) 」という、CPythonへのコントリビュートスプリントに参加しました。

他にも次のようなスプリントがありました。気になったものをいくつか紹介します。

  • Typing PEPs
  • qutebrowser: A keyboard-driven, vim-like browser based on Python and Qt
  • Patito – A data modelling layer built on top of polars and pydantic
  • Pyodide

スプリントの詳細については、EuroPython 2023のWebサイトを参照してください。

スプリント会場は「Prague University of Economics and Business」という大学で行われました。広い大学でとても気持ちの良い、きれいな会場でした。

スプリント会場の様子(1)
Photo by Braulio Lara / CC BY-NC-SA 4.0
スプリント会場の様子(1)

CPythonへのコントリビュートの流れ

コントリビュートのおおよその流れは以下のとおりです。

  • CPython環境の構築
  • 対応できそうな課題を探す
  • 対応・動作確認をする
  • コミットとPRの作成
  • ライセンスの承諾
  • レビューとマージ

順に見ていきましょう。

CPython環境の構築

CPythonの開発環境を構築する方法はいくつかあります。今回は、Visual Studio Codeの拡張機能「Dev Containers」を利用してローカル環境を構築します。CPythonの開発環境を作る、というと大変そうなイメージがありますが、Dev Containersを利用することで簡単に環境構築ができます [2] [3]

筆者の環境と事前準備

スプリントでの筆者の環境は以下のとおりです。

  • M2 MacBookAir macOS Ventura 13.4.1
  • Docker Desktop 4.19.0
  • Visual Studio Code
    • Visual Studio Code Dev Containers Extension
  • Git client

筆者の環境はMacですが、Windows/Linuxでも同様の手順でCPythonの環境構築ができます。DockerやVisual Studio Code、Visual Studio Codeの拡張機能であるDev Containersについては事前にインストールが必要です。それぞれの環境構築については、公式ドキュメントを参照してください。

また、CPythonはGitHubのリポジトリで管理されているため、GitHub アカウントが必要になります。

GitHubのCPythonリポジトリをforkする

CPythonでは、GitHubのリポジトリをforkして、自分のリポジトリにコピーしてから開発を行います。

  1. ブラウザで https://github.com/python/cpython を開く
  2. 右上のForkボタンをクリックする
  3. 自分のアカウントにforkする
CPythonのfork
CPythonのfork

Forkについての詳細は、GitHubの公式ドキュメントをご参考ください。

ローカルにgit cloneして⁠upstreamを設定する

自分のローカルにcloneして、Visual Studio Codeで開きます。<your-username> は自分のGitHubのユーザー名に置き換えてください。

git cloneを実行
$ git clone git@github.com:<your-username>/cpython.git

cloneしたリポジトリに移動して、upstreamを設定します。upstreamを設定しておくことで、forkしたリポジトリの更新をスムーズに取り込むことができ、常に最新の状態で開発を進められます。CPythonの開発は活発で、多くの人が更新を行なっています。自分の対応を行う前に、最新の状態にしておくためにupstreamを設定しておきましょう。

upstreamの設定
$ cd cpython
$ git remote add upstream git@github.com:python/cpython.git
$ git config --local branch.main.remote upstream
$ git remote set-url --push upstream git@github.com:<your-username>/cpython.git

git remote -v で設定を確認します。次のようになっていればOKです。

upstreamの確認
$ git remote -v
origin  git@github.com:<your-username>/cpython.git (fetch)
origin  git@github.com:<your-username>/cpython.git (push)
upstream        git@github.com:python/cpython.git (fetch)
upstream        git@github.com:<your-username>/cpython.git (push)

$ git config branch.main.remote
upstream

詳細については、以下の開発者向けガイドの「Setup and building」を参照してください。

Dev Containerを起動する

Dev Containerを起動し、ビルドができることを確認します。事前にDocker Desktopを起動しておいてください。

Visual Studio Codeでcloneしたリポジトリを開き、Dev Containerを起動します。Dev Containerを起動するには左下の「リモートウィンドウを開く」をクリックします。

「リモートウィンドウを開きます」ボタン
リモートウィンドウを開きます

次に「Dev Containers: Open Workspace in Container...」を選択します。Dev Containerのビルドが始まり、コンテナー上でワークスペースを開きます。

「コンテナーでワークスペースを開く」を選択

起動後、Visual Studio Codeで「cpython [開発コンテナー]」と表示され、コンテナー上でワークスペースが開いていることを確認します。

「cpython 開発コンテナー」と表示される

CPythonとドキュメントのビルド テストの実行

Visual Studio Codeで起動したDev Containerにて、CPythonとドキュメントのビルド、テストの実行ができるか確認します。本セクションで紹介した内容については、次の開発者ガイドを参照してください。

まずはじめに、CPythonのビルドを実行します。ターミナルにて以下のコマンドを実行してください。--with-pydebugオプションは、Pythonのビルド時にデバッグ情報と追加のランタイムチェックを有効にするためのものです。オプションの詳細については、公式ドキュメント3. Configure — Python 3.13.0a0 ドキュメントを参照してください。

実行後、次のようなメッセージが表示されればOKです。

CPythonのビルド
$ cd cpython
$ ./configure --with-pydebug
$ make -s -j2
...
Checked 107 modules (31 built-in, 75 shared, 1 n/a on linux-aarch64, 0 disabled, 0 missing, 0 failed on import)

makeを実行しエラーが発生する場合には、make cleanを実行後、再度configuremakeを実行してみてください。筆者の環境では、make cleanを実行しないとエラーが発生する場合がありました。

次にpython.exeを実行して、インタプリタが起動することを確認してください。

インタプリタの起動
$ ./python.exe 
Python 3.13.0a0 (heads/main:eeb4e974d0, Oct  3 2023, 16:25:42) [Clang 15.0.7 (Fedora 15.0.7-2.fc37)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

続いて、テストを実行してみましょう。次のコマンドを実行します。

テストの実行
$ ./python.exe -m test

特定のモジュールのみテストを実行する場合には、次のようにします。

特定のモジュールを指定してテストを実行
$ ./python.exe -m test -v test_asyncio
...
28 tests OK.

Total duration: 1 min 5 sec
Total tests: run=2,400 skipped=55
Total test files: run=30/30 skipped=2
Result: SUCCESS
[root@677de16698c3 cpython]# 

最後にドキュメントのビルドを確認します。ドキュメントの修正を行う場合には必要です。次のようなメッセージが表示されビルドが成功すればOKです。

ドキュメントのビルド
$ cd doc
$ make html
...
build succeeded.
The HTML pages are in build/html.
Build finished. The HTML pages are in build/html.

ビルドされたHTMLファイルcpython/Doc/build/html/index.htmlを確認してみましょう。見慣れたドキュメントをブラウザで表示できます。

ローカルでビルドされたPythonドキュメント
ローカルでビルドされたPythonドキュメント

これで開発環境が整いました。Dev Containerのおかげで、簡単に開発環境の構築ができました。

対応できそうな課題を探す

次に、対応できそうな課題を探します。課題はGitHubのIssuesで管理されています。検索は、GitHubの検索機能を利用します。まずはじめに、ラベルが "easy" のIssuesを見てみると良いでしょう。その中で自分の興味のある分野、好きな機能などを探してみてください。

タイミングによっては、対応できそうな課題がなかなか見つからないかもしれません。EuroPythonのスプリントの中では、スプリントリーダーから参加者へ「Python Organizationの別のリポジトリのIssuesも見てみてはどうか」という紹介がありました。次のリンクは、Python Organizationのうち、ラベルが "easy", "good first issue", "help wanted" のものです。参考にしてみてください。本記事の環境構築と同様に、GitHubのリポジトリをforkして、自分のリポジトリにコピーしてから開発を行い対応できます。

対応⁠動作確認をする

修正したい課題を見つけたら、対応してみましょう。対応する時の注意点としては次のとおりです。

  • Issueの内容をよく読む
  • Issueの内容に沿って、修正を行う
  • テストを実行して、修正が正しく動作することを確認する
  • ドキュメントの修正を行う場合には、ドキュメントのビルドを行い、修正が反映されていることを確認する

修正していてわからないことがあれば、Issueにコメントを残してみましょう。他にもさまざまな方法で助けを求めることができます。Issueのコメントのほかに、メーリングリストや、Discordのチャンネルなどがあります。詳細については、開発者ガイドを参照してください。

コミットとPRの作成

良いコミットとは

CPythonでは良いコミットは以下の2点であるとされています。

  • 1つのコミットで複数の修正を行わない
  • 修正と関係のないコードのレイアウトの修正を行わない

またコミットメッセージの書き方として、Pythonの開発者ガイドの中でHow to Write a Git Commit Messageというブログ記事が紹介されています。その中では次のように書くと良いとされています。抜粋して紹介します。

  • タイトルと本文を空白行で区切る
  • タイトルは50文字まで
  • タイトルをピリオドで終わらせない

1行目をタイトルとして概要を簡潔に書き、$ git log --onelineで表示したときに読みやすいように心がけましょう。もちろん英語で書く必要があります。

コミットやコミットメッセージの詳細については、前述のブログや次の開発者ガイドを参照してください。

良いPull Requestとは

CPythonでの良いPull Request(PR)とは以下のように記載があります。確実に受け入れられるように、これらの対応を行うと良いとされています。

  • 適切なバージョンへの変更 - 一般的にはmainに行う
  • PEP 8/PEP 7に従うこと
  • 下位互換性を考慮すること
  • 適切なテストが追加されていること
  • すべてのテストにパスしていること
  • ドキュメントが更新されていること

またこれらをチェックするために、以下のコマンドが用意されています。確実に実行するようにしましょう。

$ make patchcheck

ライセンスの承諾

修正を行いCPythonへのPRを出すと、ライセンスの承諾を要求するボットが自動でコメントします。

license-botのコメント
license-botのコメント

コントリビュートを行うためには、Contributor Agreements に同意する必要があります。これはPythonを管理する非営利団体「PSF(Python Software Foundation⁠⁠」のPSF Licenseに基づいたPythonで使用するコードのライセンスを許可するためのものです。

署名するには、ボットのコメントにあるリンクをクリックし、数ステップの操作が必要です。操作はとても簡単です。内容をよく読み、同意する場合には署名してください。クリックするだけで署名を行うことができ、即日完了します。署名すると、ボットのコメントに署名したことが表示されます。

詳細については開発者ガイドを参照してください。

レビューとマージ

ここまでで、コミットとPRの作成ができました。最後にレビューとマージが必要です。PRを出すと、CPythonのコア開発者がレビューを行います。レビューのコメントを受けて、修正を行いましょう。

マージまでは時間がかかる場合があります。気長に待ちましょう。わたしの場合は、PRを出してから約1ヵ月後にマージされました。

まとめ

本記事では、CPythonへのコントリビュートの流れを紹介しました。参加したスプリントでコントリビュートの流れを体験できたのは、とても良い経験でした。今回わたしは課題を持って参加しませんでしたが、課題を持って参加されている方も多くいらっしゃいました。課題解決の議論を気軽に、CPythonのコア開発者(課題によっては実装者や仕様を決めた方である場合もある)と直接できるチャンスというのはなかなかないと思います。また「そのあたりの仕様は向こうの部屋にいる彼が詳しいよ」といった様子は、まるで1つのプロジェクトルームで「Python」という大きなプロジェクトに参画しているような感覚になりました。OSSであるPythonはひとりひとりの手にによって作られているのだという実感こそが代え難い経験だったように思います。

CPythonは、多くの人によって開発、利用されているOSSです。30年以上の歴史を経て、多くの人が気軽にコントリビュートできる環境が整っています。開発環境構築の容易さ、開発者向けドキュメントの充実、また問題解決のための助けを求めることができるコミュニティの存在など、コントリビュートしやすい環境が整っています。すぐにコントリビュートできる課題に出会えないかもしれませんが、気長に探してみてください。

また、2023年10月26日(木)から10月29日(日)に行われるPyConAPAC 2023でもCPythonのスプリントがあるようです。興味の湧いた方はぜひこちらもご覧ください。

おすすめ記事

記事・ニュース一覧