python - C 程序可以有 Python GUI 吗?

标签 python c wxpython pyqt

我的 friend 有一个用 C 编写的应用程序,它带有一个在 Linux 下使用 GTK 制作的 GUI。现在我们想用 python(wxpythonPyQT)重写 GUI。

我没有使用 Python 的经验,也不知道如何让 Python 与 C 通信。我想知道这是否可行,如果可行,我应该如何实现它?

最佳答案

是的,可以从 Python 调用“C”函数。

请查看 SWIG(已弃用),Python 也提供了自己的可扩展性 API。您可能想调查一下。

还有谷歌 CTypes。

链接:

Python Extension

一个简单的例子: 为此,我在 Windows 上使用了 Cygwin。我在这台机器上的 python 版本是 2.6.8 - 使用 test.py 加载名为“myext.dll”的模块对其进行了测试 - 它工作正常。您可能希望修改 Makefile 以使其在您的机器上运行。

原创.h

#ifndef _ORIGINAL_H_
#define _ORIGINAL_H_

int _original_print(const char *data);

#endif /*_ORIGINAL_H_*/

原创.c

#include <stdio.h>
#include "original.h"

int _original_print(const char *data)
{
  return printf("o: %s",data);
}

stub .c

#include <Python.h>
#include "original.h"

static PyObject *myext_print(PyObject *, PyObject *);

static PyMethodDef Methods[] = {
  {"printx", myext_print, METH_VARARGS,"Print"},
  {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initmyext(void)
{
  PyObject *m;
  m = Py_InitModule("myext",Methods);
}

static PyObject *myext_print(PyObject *self, PyObject *args)
{
  const char *data;
  int no_chars_printed;
  if(!PyArg_ParseTuple(args, "s", &data)){
      return NULL;
  }
    no_chars_printed = _original_print(data);
    return Py_BuildValue("i",no_chars_printed);  
}

生成文件

PYTHON_INCLUDE = -I/usr/include/python2.6
PYTHON_LIB = -lpython2.6
USER_LIBRARY = -L/usr/lib
GCC = gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/include -I/usr/include/python2.6 

win32 : myext.o
    - gcc -shared myext.o $(USER_LIBRARY) $(PYTHON_LIB) -o myext.dll

linux : myext.o
    - gcc -shared myext.o $(USER_LIBRARY) $(PYTHON_LIB) -o myext.so

myext.o: stub.o original.o
    - ld -r stub.o original.o -o myext.o

stub.o: stub.c
    - $(GCC) -c stub.c -o stub.o

original.o: original.c
    - $(GCC) -c original.c -o original.o

clean: myext.o
    - rm stub.o original.o stub.c~ original.c~ Makefile~

测试.py
import myext
myext.printx('hello world')

输出

o: hello world

关于python - C 程序可以有 Python GUI 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13173029/

相关文章:

python - Django 表单在提交之前正在验证

c - 如何使用 OpenMP 加速 C++ 代码?

python - 用于在 Python 中编程 GUI 的所见即所得工具?

python - 如何在一个 python 脚本中控制/调用另一个 python 脚本? (脚本之间的通信)

python - 如何从Python提高Easticsearch的查询准确性?

python - 游戏交叉编译打包

c - 如何创建一个 TCP 服务器-客户端程序,将 200 个 tcp 流从源发送到目的地?

python - wxPython - wx.TextCtrl - 强制样式

python - 何时在 tkinter 中使用包或网格布局?

c - 这个将元素添加到链表的函数有什么问题?