001.python调用C函数

【背景】在python中没有无阻塞的键盘输入函数,

【应用场景1】等待输入,超时后使用缺省值.

【应用场景2】在菜单中输入一个字符,然后根据字符进行不同的功能(不需要键入回车键)

【分析】在c函数库中,有对应的函数getch()和kbhit(),这两个函数在conio.h头文件中

【编程环境】

1、python版本:Python 3.4.3

2、C编译器IDE:MinGW Developer Studio 2.05 Build date:04-01-2005

3、编译器版本:gcc version 3.4.2 (mingw-special)

【MinGW Developer Studio 开发动态包】

1、创建一个工程“Win32 Dynamic-Link Library”,工程名为myPythonExtend

2、添加一个源文件:KeyboardExtend.c

3、在菜单“Edit”-->"Options...",弹出对话框

(1)添加python头文件目录

001.python调用C函数

(2)添加python库文件目录

001.python调用C函数

4、在菜单“Project”-->"Settings...",弹出对话框

(1)添加Debug 的link选项

001.python调用C函数

Debug\Win32CIO.pyd

python34

(2)添加Release的link选项

001.python调用C函数

Release\Win32CIO.pyd

python34

5KeyboardExtend.c文件内容:

#include

#include

#include

 

static  PyObject * mytest()

{

    printf("enter key\n");

    for(;;)

    {

        int d;

        if (d = kbhit() != 0)

        {

            int c = getche();

            if (c=='q')

            {

                break;

            }

            printf("your input:%c,%c\n",d,c);

        }

    }

    PyObject* resultObject = Py_BuildValue("i" , 0);

    return  resultObject;

}

 

static  PyObject *mypy_getchar(PyObject *self, PyObject *args)

{

    char result = getchar();

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

 

static  PyObject *mypy_putchar(PyObject *self, PyObject *args)

{

    int ch;

    PyArg_ParseTuple(args, "i" , &ch);

    int result = putchar(ch);

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

 

static  PyObject *mypy_getch(PyObject *self, PyObject *args)

{

    int result = getch();

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

 

static  PyObject *mypy_getche(PyObject *self, PyObject *args)

{

    int result = getche();

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

 

static  PyObject *mypy_kbhit(PyObject *self, PyObject *args)

{

    int result = kbhit();

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

static  PyObject *mypy_putch(PyObject *self, PyObject *args)

{

    int ch;

    PyArg_ParseTuple(args, "i" , &ch);

    int result = putch(ch);

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

static  PyObject *mypy_ungetch(PyObject *self, PyObject *args)

{

    int ch;

    PyArg_ParseTuple(args, "i" , &ch);

    int result = ungetch(ch);

    PyObject* resultObject = Py_BuildValue("i" , result);

    return  resultObject;

}

 

 

//模块方法表

static  PyMethodDef c_io_methods[] = {

    {"getchar" , mypy_getchar, METH_VARARGS, "int getchar (void) " },

    {"putchar" , mypy_putchar, METH_VARARGS, "int putchar (int) " },

    {"getch" ,   mypy_getch,   METH_VARARGS, "int getch (void) " },

    {"getche" ,  mypy_getche,  METH_VARARGS, "int getche (void) " },

    {"kbhit" ,   mypy_kbhit,   METH_VARARGS, "int kbhit (void) " },

    {"putch" ,   mypy_putch,   METH_VARARGS, "int putch (int) " },

    {"ungetch" , mypy_ungetch, METH_VARARGS, "int ungetch (int) " },

    {"mytest" ,  mytest,       METH_VARARGS, "mytest " },

    {NULL , NULL }

};

 

static  struct  PyModuleDef win32Module_c_io = {

    PyModuleDef_HEAD_INIT,

    "Win32CIO" ,

    "Win32 conio and stdio" ,

    -1 ,

    c_io_methods,

    NULL ,

    NULL ,

    NULL ,

    NULL

};

 

//初始化函数

PyMODINIT_FUNC

PyInit_Win32CIO(void )

{

    return  PyModule_Create(&win32Module_c_io);

}

 

6、编译生成Release\Win32CIO.pyd

拷贝该文件到D:\app\Python34\Lib\site-packages

 

【python调用模块函数】

#!/usr/bin/python

# -*- coding:utf-8 -*-

import Win32CIO

       

if __name__ == '__main__':

    while(True):

        d = Win32CIO.kbhit();

        if (d != 0):

            c = Win32CIO.getche();

            if (c == None):

                break

            print("your input:%c,%c\n" % (d,c))

    pass

 

【解释】

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengyoufengyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值