10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonのC拡張やってみた

Posted at

チュートリアルのC や C++ による Python の拡張 の前半を写経した。
Cythonの勉強しようかと思っていたけど、上の方法のブログ記事がたまたま出てきたのでやってみた感じです。
そこまで難しくなさそうという印象です。まだAPIとか何もわかっていませんが。。
本当にチュートリアルのまま spammodule.cをカキカキ。
コメントもチュートリアルの本文そのまま貼っつけ。

spammodule.c
#include <Python.h>

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
  const char *command;
  int sts;

  if (!PyArg_ParseTuple(args, "s", &command))
    /*Python の文字列または Unicode オブジェクトを、キャラクタ文字列を指す
      C のポインタに変換. "s"の意味
    */
      return NULL;

  sts = system(command);
  return Py_BuildValue("i", sts);
  /*書式化文字列と任意の数の C の値を引数にとり、新たな Python オブジェクト
   を返す. "i"は整数オブジェクトという意味*/
}

static PyMethodDef SpamMethods[] = {
  {"system", spam_system, METH_VARARGS,
   "説明 Execute a shell command."},
  {NULL, NULL, 0, NULL}
};


PyMODINIT_FUNC
initspam(void)
{
  (void) Py_InitModule("spam", SpamMethods);
}

無事書き終えたらsetup.pyを以下のように作成。
こちらの記事を参考にしました。

setup.py

from distutils.core import setup, Extension

module1 = Extension('spam',
                    sources = ['spammodule.c'])

setup (name = 'Spam',
       version = '1.0',
       description = 'This is a spam package',
       ext_modules = [module1])

あとはコマンドライン上で

$python setup.py build

(今回は実験なのでinstall はしない)
を実行する。するとカレント直下にbuildというディレクトリができる。
中身は環境によって違うのかと思いますが、spam.soのパスを指定してimportすれば
使えるようです。
私は適当なディレクトリにspam.soごとコピペしました(いいのかな?)
適当なメモでした。

10
13
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
10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?