2018年6月26日 星期二

用C語言擴展Python功能:適用使用時機,要驅動嵌入式Linux新硬體

Python中文維基:Python 直譯器本身幾乎可以在所有的作業系統中執行。Python的正式直譯器CPython是用C語言編寫的、是一個由社群驅動的自由軟體,目前由Python軟體基金會管理。

維基上也說:以 C++ (或 C) 撰寫的模組通常用於延伸 Python 解譯器的功能,以及啟用低階作業系統功能的存取。 及 在操控硬體的場合使用C++(C語言),在快速開發時候使用Python。

因Python是由C語言實作完成的,所以在很多嵌入式系統可以用已經寫好的Python API很容易驅動硬體,但在要增加新硬體,且要能由Python驅動,就一定要先有寫好的硬體驅動程式(C語言),再用C語言擴展Python功能完成類似OS上的AP,用以驅動寫好的新硬體驅動程式(C語言)。
這裡我在ARM板上(任意開發板或樹梅派也行),簡單DEMO一Hello 範例,程式如下:

hellomodule.c

#include <Python.h>
static PyObject* hello_name(PyObject *self, PyObject *args)
{
    const char *name;
    if (!PyArg_ParseTuple(args, "s", &name))
    {
        return NULL;
    } 
    printf("Hello %s!\r\n", name);
    Py_RETURN_NONE;
}
static PyMethodDef HelloMethods[] =
{
    {"hello", hello_name, METH_VARARGS, "Hello Example"},
    {NULL, NULL, 0, NULL}
};
static struct PyModuleDef hello =
{
    PyModuleDef_HEAD_INIT,
    "hello",     /* name of module */
    "",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module,
                    or -1 if the module keeps state in global variables. */
    HelloMethods
};
PyMODINIT_FUNC PyInit_hello(void)
{
    return PyModule_Create( &hello );
}

使用以下指令編譯
gcc -fpic --shared $(python3-config --includes) hellomodule.c -o hello.abi3.so

再來準備 setup.py,程式如下:

from setuptools import setup, Extension
setup(
    name='hello',
    version='1.0',
    description='Python Package with Hello World C Extension',
    ext_modules=[
        Extension(
            'hello',
            sources=['hellomodule.c'],
            py_limited_api=True)
    ],
)

接著下安裝指令:
python3 setup.py install

安裝成功後,即可利用Python程式使用剛安裝好 C 的函式庫,
helloworld.py 程式如下:

import hello

def main():
    hello.hello('World')

if __name__ == "__main__":
    main()
 
 
本範例是在Python3.5下完成,接著驗證,下達指令:

python3.5 helloworld.py

成功!!

有關更詳細的Python API的說明,請參考:
Python Documentation contents
https://docs.python.org/3.5/contents.html

有關實作Python 使用 C 的函式庫,更詳細的說明,請參考:
Extending Python with C or C++
https://docs.python.org/3.5/extending/extending.html

執行過程的畫面:



沒有留言:

張貼留言

FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...