質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2202閲覧

【C言語で作成した関数をPythonで実行】#include "cpython/initconfig.h" が参照されない。

toriaezu_NAMA

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/10 14:07

経緯

「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

URL
https://tanakatarou.tech/261/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/06/11 01:15 編集

> -Idir を付けましたが、参照されませんでした。 -Idir/Users/~~~/Python/Python39/include/Python.h/cpython/initconfig.h を -I C:\Users\~~~\Python\Python39\include または -I C:/Users/~~~/Python/Python39/include に変えたら、いかがでしょうか?
toriaezu_NAMA

2021/06/11 03:40

回答いただきありがとうございます。 別の方にもご指摘いただき、-I/~~~/Python39/include で wrap_file.o の作成ができました。 質問の方の編集につきましては、暇ができたタイミングで行わせていただきます。
guest

回答2

0

この手のことはlinuxでしかやったことがないので、Windowsの場合は正確にはわかりません。

linuxの場合で説明します。

pyconfig.h はソースファイルには入っていません。
configure を動かしたときに生成されます。

ソースディレクトリに移動して以下を実行してください。

shell

1$ /usr/SRC/Python-3.9.1 2$ ./configure

これでこのディレクトリにpyconfig.h が生成されます。

次にコンパイルします。

python

1$ gcc -fPIC -Wall -c -I/usr/SRC/Python-3.9.1/Includ 2e -I/usr/SRC/Python-3.9.1 -o wrap_file.o wrap_file.c

これでwarningは出ますがコンパイルしてwrap_file.oが作成されています。

投稿2021/06/10 15:17

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriaezu_NAMA

2021/06/10 15:48

回答して頂きありがとうございます。 上記のサイトでもLinux環境でやっていることを見落としてました。 Linux環境で回答内容を実行した後、再度コメントします。
toriaezu_NAMA

2021/06/11 11:22

Linuxの方では参照したページの内容でコンパイルができました。 回答いただき、ありがとうございました。
guest

0

ベストアンサー

-Idir<path>ではなく-I<path>です


/Users/~~~/Python/Python39/include/Python.h/cpython/initconfig.h

/Users/~~~/Python/Python39/include/
にします

windowsのコンパイルオプションは

gcc -o wrap_file.o -c wrap_file.c -I/~~~/Python39/include gcc -shared -o wrap_file.pyd wrap_file.o -L/~~~/Python39/libs -lpython39

のようになると思います

投稿2021/06/10 15:04

編集2021/06/10 16:21
taC-h

総合スコア289

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriaezu_NAMA

2021/06/10 15:27

回答を確認し-I<path>でコンパイルしましたが、上記のエラーが返ってきました。
toriaezu_NAMA

2021/06/11 03:35

上記1行目で実行したところ 無事、wrap_file.c が作成できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問