fatal error: Python.h: No such file or directory の原因と直し方【Dockerで検証済み】
fatal error: Python.h: No such file or directory の原因と解決方法。検証済みの解決コマンド付きで、現象→原因→解決→確認の順に最短で直せます。
発生したエラー
fatal error: Python.h: No such file or directory結論:まずこれで直ります
このエラーは、C言語でPython拡張モジュールをコンパイルしようとした際に、Pythonのヘッダファイル(Python.h)が見つからないために発生します。下の解決コマンドを順に実行すれば直ります。
apt-get update -y && apt-get install -y python3-dev gcc現象どんなエラーか
次の操作を行うと(検証環境: python:3.11)、上記のエラーが発生します。まずは下の再現コマンドで、同じ状況を再現できることを確認してください。
検証環境:python:3.11
cat > /tmp/hello_ext.c << 'EOF'
#include <Python.h>
static PyObject* say_hello(PyObject* self, PyObject* args) {
printf("Hello from C extension!\n");
Py_RETURN_NONE;
}
static PyMethodDef HelloMethods[] = {
{"say_hello", say_hello, METH_VARARGS, "Print hello."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef hellomodule = {
PyModuleDef_HEAD_INIT, "hello", NULL, -1, HelloMethods
};
PyMODINIT_FUNC PyInit_hello(void) {
return PyModule_Create(&hellomodule);
}
EOF
gcc -shared -fPIC -o /tmp/hello.so /tmp/hello_ext.c 2>&1; exit 0原因なぜ起きるのか
このエラーは、C言語でPython拡張モジュールをコンパイルしようとした際に、Pythonのヘッダファイル(Python.h)が見つからないために発生します。 原因: Python.h はPythonのC APIを使うために必要なヘッダファイルですが、通常のPythonランタイムパッケージには含まれておらず、開発用ヘッダパッケージ(Debian/Ubuntu系では python3-dev、RHEL系では python3-devel)を別途インストールする必要があります。 解決策: `apt-get install -y python3-dev` で開発用ヘッダとライブラリをインストールします。これにより Python.h が /usr/include/python3.x/ 以下に配置されます。コンパイル時には `-I$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))")` でインクルードパスを明示的に指定することで、確実にヘッダを参照できます。pip でC拡張を含むパッケージ(例: numpy, Pillow, psycopg2 等)をソースからビルドする場合も同様に python3-dev が必要です。
解決解決手順
apt-get update -y && apt-get install -y python3-dev gcc確認直ったか確認する
PYTHON_INCLUDE=$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))")
gcc -shared -fPIC -I"${PYTHON_INCLUDE}" -o /tmp/hello.so /tmp/hello_ext.c && echo 'Build succeeded' && exit 0動画で見る
この記事の解決手順は実環境で検証しています
山田 英紀(社内SE 5年以上・13業種以上の業務システムを開発/運用)が、 掲載コマンドを検証環境で実行し、再現〜解決〜確認まで通ることを確認しています。