pythonにできないことをするには、C言語が便利。
GO言語は、C言語に比べ便利で速いが十中八九ポインターでハマる。なぜなら値でインターフェイスされるから(by Valueが基本でby referenceが不得意)ポインターで渡してもindexを取ることができない。
- スピード向上など
- ライブラリ化
- 実験設備を制御したい。
- 直接IOを読み書きしたい。
- C言語用インターフェイスは、用意されているのにPythonのための用意がない。
##では、「眺めて覚える」主旨に基づいて例文を見ていきましょう。
必要なものは、
1. GCC
** gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0**
2. Python
Python 3.7.4
3. Visual studio code のような高度なエディタ
Version: 1.41.1 (system setup)
OS: Windows_NT x64 10.0.18362
最初の一歩
適当な名前のホルダを作りましょう。
下記のプログラムをコピーしよう!
> mkdir capi
pythonのテスト用ライブラリ呼び出し
capi.py
import myModule as capi #適当な名前を付ける(testとかつけるとハマるよ
capi.hello()
ライブラリ本体
capilib.c
# include <Python.h>
static PyObject* hello(PyObject* self, PyObject* args)
{
printf("Hello World 東京\n");
return Py_None;
}
// 関数名、仕様等の定義
static PyMethodDef myMethods[] = {
{ "hello", hello, METH_NOARGS, "Hello World"},
{ NULL }
};
// Module Definition struct
static struct PyModuleDef myModule = {
PyModuleDef_HEAD_INIT,"myModule","C API Module",-1,myMethods
};
// 上記の構造体を初期化する
PyMODINIT_FUNC PyInit_myModule(void)
{
return PyModule_Create(&myModule);
}
ライブラリ作成用スクリプト
setup.py
from distutils.core import setup, Extension
setup(name = 'myModule', version = '1.0.0', \
ext_modules = [Extension('myModule', ['capilib.c'])])
ライブラリの作成します。
python setup.py install
running install
running build
running build_ext
running install_lib
running install_egg_info
Removing C:\ProgramData\Anaconda3\Lib\site-packages\myModule-1.0.0-py3.7.egg-info
Writing C:\ProgramData\Anaconda3\Lib\site-packages\myModule-1.0.0-py3.7.egg-info
ライブラリの確認方法
\capi>pip freeze
...
myModule==1.0.0
...
文字化け対策
> chcp 65001
実行する
capi>python capi.py
Hello World 東京