経緯
「C言語で作成した関数をPythonで実行したい。」
と思い、適当なサイトを調べ挑戦しようと思ったのですが、下記のエラーで
wrap_file.o が作成できなかったので質問しました。
発生している問題・エラーメッセージ
エラーにある "initconfig.h" が
ディレクトリ cpython 内に存在しているのですが参照されていない状況にあります。
C:\Users\~\c_python>gcc -fPIC -Wall -c -o wrap_file.o wrap_file.c In file included from C:\Users\~~~\Python\Python39\include\Python.h:85:0, from wrap_file.c:3: C:\Users\~~~\Python\Python39\include\pytime.h:123:59: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); ^~~~~~~ C:\Users\~~~\Python\Python39\include\pytime.h:130:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration struct timeval *tv, ^~~~~~~ C:\Users\~~~\Python\Python39\include\pytime.h:135:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration struct timeval *tv, ^~~~~~~ In file included from C:\Users\~~~\Python\Python39\include\pystate.h:143:0, from C:\Users\~~~\Python\Python39\include\genobject.h:11, from C:\Users\~~~\Python\Python39\include\Python.h:123, from wrap_file.c:3: C:\Users\~~~\Python\Python39\include\cpython/pystate.h:9:32: fatal error: cpython/initconfig.h: No such file or directory #include "cpython/initconfig.h" ^ compilation terminated.
該当のソースコード
ソースコードは下記「実行環境/参照したURL」内にあるサイトを
コピペしinclude先だけ変更したものです。
// /usr/include/下にPython.h があるので探してください。 #include "C:\Users\~~~\Python\Python39\include\Python.h" // c_file.c で定義した関数を使用します。 extern int func1(x,y); // Pythonのオブジェクトを作成しています。おまじないです。 PyObject* f_func1(PyObject* self, PyObject* args) { // ローカル変数定義 int x; // func1のxの型 int y; // func1のyの型 int result; // funct1の戻り値の型 // "ii" はx と yの型をpythonの型に変換したものです。x, yがint型なので ii、他の型は下の表を参照。 if (!PyArg_ParseTuple(args, "ii", &x, &y)) return NULL; // c_file.c の関数を実行 result = func1(x, y); // 結果を返す。ここで、"i"はresult の型です。下の表を参照。 return Py_BuildValue("i", result); } // 上記とほぼ一緒なので割愛します。 extern void func2(adrs,name); PyObject* f_func2(PyObject* self, PyObject* args) { char* adrs; char* name; if (!PyArg_ParseTuple(args, "ss", &adrs, &name)) return NULL; func2(adrs,name); return Py_BuildValue(""); } // おまじないです。{Pythonで使う名前, このファイルで定義されている名前,METH_VARARGS} static PyMethodDef methods[] = { {"func1", f_func1, METH_VARARGS}, {"func2", f_func2, METH_VARARGS}, {NULL} }; // おまじない。 static struct PyModuleDef module_name = { PyModuleDef_HEAD_INIT, "module_name", // Python でimport する名前。import module_name になる。 "", -1, methods }; // おまじない。 PyMODINIT_FUNC PyInit_module_name(void) // PyInit_<Python でimportする名前。> { return PyModule_Create(&module_name); // Python でimportする名前。 }
試したこと
gcc のディレクトリ探索のオプションを知り
-Idir を付けましたが、参照されませんでした。
gcc -fPIC -Wall -c -o wrap_file.o wrap_file.c -Idir/Users/~~~/Python/Python39/include/Python.h/cpython/initconfig.h
実行環境 / 参照したURL
python3 --version Python 3.9.5
gcc -dumpversion 6.3.0
回答2件
あなたの回答
tips
プレビュー