Python.hの場所を取得する

丸一年、ブログ書いてないですね。気にせず小ネタ。

Pythonには拡張モジュールというものがあって、CやC++などの言語でPythonのモジュールを作ることができます。

docs.python.org

そしてそのために必須なCヘッダとして、 Python.h がありますが、このヘッダのパスを取るためにはどうするか、という話です。

結論から言うとsysconfigモジュールを使います。 get_config_varsメソッドを使うと、Pythonの構成情報にアクセスすることができます。

import sysconfig
import pprint
pprint.pprint(sysconfig.get_config_vars())
{'ABIFLAGS': 'm',
 'AC_APPLE_UNIVERSAL_BUILD': 0,
 'AIX_GENUINE_CPLUSPLUS': 0,
 'ANDROID_API_LEVEL': 0,
 'AR': 'ar',
 'ARFLAGS': 'rc',
 'BASECFLAGS': '-Wno-unused-result -Wsign-compare -Wunreachable-code',
 'BASECPPFLAGS': '',
 'BASEMODLIBS': '',
(以下略)

私の環境ではこの結果が749行ありましたが、このうちPython.hへのパスを持っているのはINCLUDEPYCONFINCLUDEPYというキーの値でした。ちなみにそれぞれの違いはわかりません、どなたかご存知の方がいれば教えてください。

先ほどのsysconfig.get_config_varsには引数を与えることもできて、先ほどわかったキーを渡せば、無事にその値が取れます。

import sysconfig
sysconfig.get_config_vars('INCLUDEPY')

私の環境ではanyenvを入れていてPythonは3.6.6なので、 ${HOME}/.anyenv/envs/pyenv/versions/3.6.6/include/python3.6mが出ました。

ちなみに、python -m sysconfigと書けば、スクリプトとして上記の情報を取得できます。 シェルスクリプトなどでこの情報を使いたい時には、こっちの方が便利な時もあるかもです。

この情報を使って簡単なツールを作ろうとしているので、気が向いたらその話もします。