キーワード: Python, extension, C/C++, IDE, Visual Studio, CLion, VSCode, デバッガ
Pythonを用いてライブラリやアプリケーションを開発していると、性能向上や複雑な処理を実現するために、C/C++で開発されたネイティブコードと連携させたいことがあります。
あるいは、C/C++で開発しているライブラリやツールで、Pythonのインターフェースを提供したいことがあります。
PythonとCのBindingの開発では、複数の良質なドキュメントがあるため、最初の一歩を容易に踏みだせるようになっています。
Microsoft Windowsに依存した拡張作成であれば、Microsoftのドキュメントに従って開発するといいでしょう。ここではPythonらしく、マルチプラットフォームで利用できるライブラリを作成するときに活用できる開発環境のノウハウを共有したいとおもいます。
C/C拡張モジュールの開発のためのAPIやC/Cの流儀などについては、本稿ではふれません。
さて、Pythonの開発では、どんなエディターや開発環境を利用していますか?
2017年から、Pythonソフトウエア財団とJetbrainsが共同でおこなうデベロッパー調査が4年にわたり継続的に行なわれており、その結果を見てみましょう。
2万4000超人の開発者に聞いた、Pythonで使う開発環境第1位は?(2019年調査結果)
順位 プロダクト シェア
1 PyCharm 33%
2 VS Code 24%
3 Vim 9%
4 Sublime Text 6%
PyCharmとVS Codeで調査された開発者たちの約半数になります。
2020年の調査結果では、開発環境のオペレーテングシステムの調査結果では、Linuxが一位で、より経験年数の多い開発者ほどmacOSかLinuxを選択する傾向があるようです。
わたしもLinuxをプライマリーの開発環境にしています。この記事では、Linux, Windows, macOSで共通して利用できる開発環境を対象にしていきます。PyCharmとVS Codeは、この条件にマッチしています。
2020年の調査では、前年にくらべ、VS Codeのシェアが増していますが、PyCharmも引き続き首位を維持しています。
C/C++拡張モジュールを開発するときの開発環境はどうでしょうか。
C++開発者調査2020 では、C++開発者がプライマリーに利用しているエディターや開発環境を調査しています。
順位 プロダクト 回答数
1 Visual Studio 351
2 VS Code 162
3 Vim 135
4 CLion 99
ここで、これまで出てこなかった CLion がでてきました。CLionは、PyCharmを開発するJetBrains社のプロダクトの一つで、C/C++開発用のマルチプラットフォームのIDEです。PyCharm Professionalの機能をプラグインで追加して利用できるため、Python/Cの双方を開発できます。実は、筆者は、PyCharm ProfessionalとCLionと、(Java用のIntelliJ IDEA Ultimateも)、Linux上で利用しています。
無償で導入できて、PythonとC/C++の開発に利用できて、マルチプラットフォームで動作する VS Code を本稿では利用していきます。残念ながら筆者はVS Codeをほとんど利用していないため、時々、CLionの事例をはさみこみます。
さて、VS Codeを導入して、PythonとC/C++拡張を開発できるように設定していきましょう。
Visual Studio Code(VS Code)のダウンロードサイトから利用している環境にあったパッケージをダウンロードして導入してください。
インストールできたら、拡張機能を導入していきます。まず、"C/C++"を拡張機能の検索ボックスにいれて、"C/C++ Extension Pack"を選択して導入してください。C/C++開発に必要な複数の拡張機能が一気に導入されます。
続いて、"Python"で検索して、Pythonサポートの拡張機能を導入します。
開発するわけですから、PythonとC/C++コンパイラーを導入します。
Linux(Ubuntu, Mint, Debian, etc)では
Linux(Fedora, CentOS, etc)では、
macOSでは、
Windowsを主たる開発環境にする場合は、必要なツールをブラウザで手動でダウンロードして、適切に設定してインストールする必要があります。
* Python for Windows download から最新の安定板を導入
* Microsoft Build Tools for Visual Studio 2019 から、Visual C++ 14.2 compilerを導入
ここでPythonインストール時に、カスタム導入を選択し、開発ライブラリを導入するように選ぶのがコツです。
macOSやLinuxを主たる開発環境として選択しつつ、Windowsでの動作確認をおこなうには、マイクロソフトの Get a Windows 10 development environment ページからVirtualBox や Parallels 用の開発用のVMイメージを利用することができます。
このVMイメージでは、2021年8月現在、次のような環境が設定された状態になってダウンロードすることができます。
このイメージ上で、 Visual Studio Installer を起動し、 C++ デスクトップ開発と Python 開発を選択して、モジュールを追加することで環境がととのいます。VMイメージのOSのライセンスは30日の期間限定です。
本稿の環境では、 "C++ CMake tools for Windows"と、"Python native development tools"、"MSVC v142", "Windows 10 SDK"が必ず含まれるように注意してください。VM環境では、これで環境がととのいます。
Pythonプロジェクトを作成します。最近の流儀だと、pyproject.tomlファイルとsetup.cfgに記述していくのがモダンです。公開するOSS開発にも適合するように、ディレクトリ構造は次のようにします。
最低限のpyproject.tomlはつぎのような内容です。
setup.cfgはつぎのようになります。
setup.pyはつぎのようになります。
C/C++ 拡張を追加するPythonプロジェクト設定の追加
さて、C/C++拡張の設定を追加しましょう。extディレクトリを作成し、拡張モジュールのCソースを追加します。
setup.pyに拡張をビルドする設定を追加します。
このディレクトリ構成は、CPython APIの拡張および CFFIによる拡張の両方を開発する構成になります。CによるPython3実行環境では、CPython APIによる拡張を動作させられますが、Pythonを高速実行できるPyPyではCFFIによる拡張が必要です。
setup.pyの例は、CPython APIの拡張について記述されています。
PythonのC/Cの拡張を開発していきますと、Pythonコードのデバッグと、C/Cのデバッグを行き来しながら開発したくなります。
さきほどご紹介した商用製品のC/C++ IDEのCLionの機能改善要望チケットで、C/C++とPythonのクロスデバッグ サポート要望が6年前からあがっています。
Cross-debugging Python and C++ (91イイネ)
IDEで実現するのはとてもむずかしいようです。CLionにはPython拡張が統合されているため、Pythonコードを実行すると自動的にPythonデバッガーが起動してしまい、C/C++のバグをデバッグすることができません。
そのため、手動でデバッグ版のpythonを端末から実行してデバッガーをアタッチ開始するという方法が紹介されています。
ここまでの定義では、pythonとしての定義がされていますが、C/Cとしての定義がありませんので、C/C IDEは、C/Cのコードをあつかうことが十分にできません。そこで、C/Cのクロスプラットフォーム クロスツールのビルドツールであるCMake の定義ファイルを作成します。
モダンなIDEでは、ほとんどの場合、CMakeのサポートがありますので、一度作成すれば、他のIDEへ移行することも容易です。VSCodeでも使えます。
まずは、pythonのC/C++拡張をビルドさせる設定です。途中、OSごとにことなる拡張子を判定するためのコードがふくまれています。
CMakeList.txt
これで、C/CのIDEからPythonを起動して、PythonのC/C拡張モジュールを生成させることができるようになりました。generate_extというターゲットとなります。
次は、virtualenvの定義です。python実行時のPython依存関係について、C/C++のビルド定義の一環で実現します。
つづいて、pythonのテストを起動する定義です。C/C++アプリケーションとして、Pythonを起動するため、pytest_runnerという簡単なアプリを定義しています。
こうすることで、C/CのIDEが、C/Cのカスタウアプリを実行しているつもりで実行すると、pythonがよみこまれて、pytestが起動するようになります。実行時のディレクトリが、pythonのtestをよみこめるようにIDEで定義してください。
これ以降では、具体的なプロジェクトをもとにして、デバッグ実行していきましょう。前半でご紹介したWindows の評価版の環境で実行します。
サンプルとして、筆者が開発するPython用のテキスト圧縮伸長ライブラリのPyPPMd を利用します。PyPPMdは、PPM (Prediction by partial matching)という圧縮アルゴリズムを提供するPythonライブラリです。ここでは具体的な圧縮アルゴリズムについては説明しません。リンク先のWikipedia記事などを参照してください。
すると次のように、MS Visual C++ 2019 と、VIsual Studio同梱のPython 3.7 を検出してくれました。
続いて、コマンドパレットから CMake: Build Targetを選択し、generate_ext UTILITYを選択します。すると、Pythonを起動して、自動的に拡張機能をビルドしてくれます。CMakeの設定のおかげです。
この作品は、クリエイティブ・コモンズ表示 4.0 国際(CC-BY 4.0 lnternational)ライセンスで公開されています。
オープンストリートマップを普及、整備を促進する非営利の一般社団法人 オープンストリートマップ・ファウンデーション・ジャパンの代表理事をつとめています。オープンデータとフリーソフトウエアがますます拡大して、人々が自由にソフトウエアを開発しサービスを提供して、人々がさまざまなサービスを利用できるようになり、よりよい世の中になることを期待しています。