LoginSignup
0
1

More than 3 years have passed since last update.

眺めて覚えるC言語 その1 PythonからC言語を呼ぶ(hello world)

Last updated at Posted at 2020-01-06

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 東京
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1