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

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

ただいまの
回答率

87.95%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 119

経緯

「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/

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jbpb0

    2021/06/11 07:58 編集

    > -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 12:40

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

    キャンセル

回答 2

checkベストアンサー

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/11 00:27

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

    キャンセル

  • キャンセル

  • 2021/06/11 12:35

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

    キャンセル

0

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

linuxの場合で説明します。

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

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

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


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

次にコンパイルします。

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/06/11 00:48

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

    キャンセル

  • 2021/06/11 20:22

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

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る