プログラミング

PythonとCの連携

PythonからC言語のライブラリを呼び出してみました。PythonからC言語で作成したライブラリsystem2のsystem2を呼び出し,その中でLinuxのコマンドを実行するsystem()関数を呼び出すというものです。すべて1つのシェルの中にインラインで記述しています。

#!/bin/bash

libname=system2.so

gcc -I /usr/local/include/python3.11 -fPIC -Wall -xc -shared -o ${libname} - << EOF
#include <Python.h>
#include <stdlib.h>

PyObject* system2(PyObject* self, PyObject* args)
{
    const char* command;
    if(!PyArg_ParseTuple(args, "s", &command)) return NULL;

    long len = strlen(command);
    int result = system(command);
    if(result == EOF) len = result;

    return PyLong_FromLong(len);
}
static PyMethodDef system2_methods[] = 
{
    {"system2", system2, METH_VARARGS, "execute system command"},
    {NULL},
};
#define system2_doc "module.\n"
static struct PyModuleDef module = 
{
    PyModuleDef_HEAD_INIT,
    "system2",
    system2_doc,
    -1,
    system2_methods
};
PyMODINIT_FUNC PyInit_system2(void)
{
    return PyModule_Create(&module);
}
EOF

if [ $? -eq 0 ]; then
  python3 -c "import system2; system2.system2(\"ls -la\")"
else
  echo "Compiling failed"
fi

 [kubo@centos7 link2c]$ ./system.sh
合計 32
drwxrwxr-x. 2 kubo kubo 70 4月 5 08:39 .
drwxrwxr-x. 6 kubo kubo 58 4月 4 19:06 ..
-rwxrwxr-x. 1 kubo kubo 875 4月 5 08:21 hello.sh
-rwxrwxr-x. 1 kubo kubo 8600 4月 5 08:24 my.so
-rwxrwxr-x. 1 kubo kubo 915 4月 5 08:39 system.sh
-rwxrwxr-x. 1 kubo kubo 8608 4月 5 08:39 system2.so