工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

pigpioのCライブラリを使ったC/C++プログラムをPythonから利用する

概要

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から利用する方法をまとめた。