6

私の友人は、LinuxCを使用して作成された GUI が付属するアプリケーションを作成しています。GTKここで、GUI を python (wxpythonまたはPyQT) で書き直します。

私は Python の経験がなく、Python を C と通信させる方法がわかりません。これが可能かどうかを知りたいのですが、可能であればどのように実装すればよいですか?

4

3 に答える 3

5

はい、Python から「C」関数を呼び出すことができます。

SWIG (非推奨) も調べてください。また、Python は独自の Extensibility API を提供しています。あなたはそれを調べたいかもしれません。

また、Google CTypes。

リンク:

Python 拡張機能

簡単な例: これには Windows で Cygwin を使用しました。このマシンの私の python バージョンは 2.6.8 です - 「myext.dll」と呼ばれるモジュールをロードする test.py でテストしました - 正常に動作します。を変更し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~

test.py

import myext
myext.printx('hello world')

出力

o: ハローワールド

于 2012-11-01T07:55:10.133 に答える
2

申し訳ありませんが、私はPythonの経験がないので、PythonをCプログラムと通信させる方法がわかりません。

はい、それはまさにあなたがそれをする方法です。CコードをPythonモジュールに変換すると、GUI全体をPythonで記述できます。Pythonインタープリターの拡張と埋め込みを参照してください。

于 2012-11-01T07:55:18.600 に答える
0

C または C#(Sharp) のオプションがある場合は、C# を使用して Visual Studio を使用すると、コンポーネントを簡単にドラッグ アンド ドロップして GUI を構築できます。Python で何かをしたい場合は、wxPythonを調べてください。Java には、swing と呼ばれる GUI ビルダーが組み込まれています。いくつかのチュートリアルが必要になりますが、このプログラムを移植可能にする必要がない場合を除き、C# を使用して 10 分でビルドしてください。

また、コードを C で記述し、Python からロードできる Python モジュールとしてエクスポートすることもできます。いくつかの C 関数をセットアップし、それらを呼び出す Python GUI を用意することはそれほど複雑ではありません。これを実現するには、SWIG、Pyrex、BOOSTを使用できます。

于 2012-11-01T11:22:52.590 に答える