概要
pigpioのCライブラリを使ったC/C++プログラムをPythonから利用する方法をまとめた。
背景と目的
Raspberry Pi用のGPIO制御ライブラリであるpigpioは、C言語用とPython用のライブラリが用意されているが、都合によりC言語用のpigpioライブラリを使って作成したC/C++プログラムをPythonから利用する必要が出たので、忘れないように方法をメモっておく。
詳細
0.前提
1.pigpioの準備
本筋とはあまり関係ないが、公式の説明に則り、
sudo apt-get update sudo apt-get install pigpio python-pigpio python3-pigpio
でインストールしておく。
2.C/C++プログラム
基本的に、Python/C APIを利用してPythonからC/C++プログラムを呼び出す方法は、Web上にたくさん情報があるので、それらを参考に作成していけばよい。
https://cpp-learning.com/python_c_api_step1/
等を参考。
3.setup.py
手こずりやすいのは、setup.py。2で参考になるWeb上の情報では、初歩的な内容が多く、あまり細かい部分まで触れていないことが多いからだ。
pigpioの場合、普通にC/C++プログラム作成してコンパイルするときには、公式の説明にあるとおり、
gcc -Wall -pthread -o foobar foobar.c -lpigpio -lrt
とする。つまり、pigpio、rt、pthreadというライブラリを参照するということだ。なので、setup.pyには、この参照関係を追加しなければならない。これを指定しないと、setup.py実行時にエラーが起きたり、エラーが起きなくても、Pythonから呼び出したときにインポートエラーが発生する。
で、追加するにはどうすればいいかというと、Pythonのドキュメントを読むと、Extensionの引数に、library_dirsとlibrariesという引数が指定できると書いてあるので、
from distutils.core import setup, Extension setup( name='foobar', version='1.0.0', ext_modules=[ Extension( 'foobar', ['foobar.c'], library_dirs=['/usr/local/lib'], libraries=['pigpio', 'pthread', "rt"] ) ] )
という感じで指定する。/usr/local/libは、libpigpio.soが置いてあるので、参照しないといけない。librariesには必要な3つのライブラリを指定。というわけで、自分の作ったプログラムでほかにも参照が必要なものがあれば、適宜追加すればよい。
まとめと今後の課題
pigpioのCライブラリを使ったC/C++プログラムをPythonから利用する方法をまとめた。