documentationによれば、Cythonから生成されたCヘッダファイルを使用することができます。私は問題なしでHello World
の例を続けてきましたが、今は違うことを試してみたいと思います。私は、カスタムメソッドを使用できるように公開宣言を使用したいと思います。Cythonから生成されたヘッダファイルを使用する
- hello.pyx
- setup.py
- main.cの
hello.pyx
cdef public void say_hello():
print("Hello World")
setup.py:私のコードの構造は以下のとおりです。
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("hello", ["hello.pyx", "main.c"]),
]
setup(
name='Hello app',
cmdclass={'build_ext': build_ext},
ext_modules=ext_modules
)
main.cの
#include "hello.h"
int main(void){
say_hello();
}
意図したとおりsay_hello()
方法が機能することを確認するためのテストファイルとしてmain.c
働きます。 セットアップファイルpython3 setup.py build_ext
をビルドすると、次の出力が生成されます。
running build_ext
skipping 'hello.c' Cython extension (up-to-date)
building 'hello' extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c hello.c -o build/temp.linux-x86_64-3.5/hello.o
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c main.c -o build/temp.linux-x86_64-3.5/main.o
In file included from main.c:1:0:
hello.h:26:1: error: unknown type name ‘PyMODINIT_FUNC’
PyMODINIT_FUNC inithello(void);
^
error:
command 'x86_64-linux-gnu-gcc' failed with exit status 1
hello.hファイルは、私の理解するには、以下の
/* Generated by Cython 0.25.2 */
#ifndef __PYX_HAVE__hello
#define __PYX_HAVE__hello
#ifndef __PYX_HAVE_API__hello
#ifndef __PYX_EXTERN_C
#ifdef __cplusplus
#define __PYX_EXTERN_C extern "C"
#else
#define __PYX_EXTERN_C extern
#endif
#endif
#ifndef DL_IMPORT
#define DL_IMPORT(_T) _T
#endif
__PYX_EXTERN_C DL_IMPORT(void) say_hello(void);
#endif /* !__PYX_HAVE_API__hello */
#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC inithello(void); // <-- Line 26
#else
PyMODINIT_FUNC PyInit_hello(void);
#endif
#endif /* !__PYX_HAVE__hello */
が含まれ、GCCは、Pythonの正しいバージョンを取得することができませんで(私は、Python 3.5を使っている)ようです。何とかそれを設定する方法はありますか?また、実際にそうであれば、python3 setup.py build_ext
コマンドを実行すると、が世話をするのはなぜですか?
私はCの経験が豊富なので、何か不足している可能性があります。
あなたの答えが@eadのおかげで、フラグを見つける上でのヒントは非常に便利でした。 ああ、 'main.c'のコンパイル中に、私は' inithello() 'メソッドの暗黙の宣言を受け取り、後でリンクを試みているときに' undefined reference to inithello'というエラーをスローします。 Python2.7を使用するとうまくいきます! – BitWhyz
@BitWhyz hello.hコードを調べると、Python3では 'inithello()'の代わりに 'PyInit_hello()'を使うべきだと思います。 – ead
それは働いた!ありがとうございました。私はなぜドキュメンテーションに言及していないのか理解していない。もっと掘り下げるための良い資源に感謝します。 – BitWhyz