3

これは、別の C モジュールで C PyObject のインスタンスを作成したいことを除いて、私が望んでいるように思えます。

C APIを使用して、Pythonで宣言されたPythonクラスのインスタンスを作成します

しかし、C から Python モジュールを使用するためのドキュメントを見つけることができません。誰もが Python を C で拡張することについて話しているだけなので、関連するドキュメントをオンラインで見つけることができないようです。

私の問題は、スピードアップしたい Pygame があることです。だから私は Pygame へのアクセスを必要とする C モジュールを作成しています。pygame をインポートするにはどうすればよいですか? 2 つのコピーをインポートしたくありませんよね? 私が理解できるコーディング部分は、コードを構成してリンクする方法がわかりません。私はいくつかのドキュメントが欠けているに違いないことを知っているので、誰かが私を正しい方向に向けることができれば、私は大いに感謝しています.


更新:申し訳ありませんが、投稿を読み直して、私の言葉遣いがひどいことに気付きました。

pygame がインストールされている場合は、Python/include ディレクトリを調べて、pygame ヘッダー ファイルを見つけることができます。それらは何のため?あなたのCモジュールはpygame Cモジュールに直接アクセスできると思ったので、PythonスクリプトとCモジュールは同じpygameインスタンスを使用していました。

明確化誰か?

4

3 に答える 3

1

秘訣は、通常の Python ルーチンを C で作成することです。必要に応じてPyImport_ImportModule()PyObject_GetAttr()、およびを使用PyObject_Call()します。

于 2010-01-31T05:51:18.030 に答える
0

pygame C-API を使用することはできますが、おそらくそのように使用することを意図したものではありません (これは、なぜ pygame ヘッダーが pygame パッケージと共にインストールされるのかという疑問を投げかけます)。

そのような「内部」API に対して構築された拡張機能は、pygame 開発者がこれらの C ヘッダーの API/ABI 互換性を気にしない限り、pygame の次のバージョン/ビルドが出たときに壊れる可能性があります...

とにかく、ここに例があります:

C 拡張モジュール コード (red.c):

#include <Python.h>
#include <pygame/pygame.h>

static PyObject* fill_surface(PyObject* self, PyObject* args)
{
  PyObject* py_surface = NULL;
  if( !PyArg_ParseTuple(args, "O", &py_surface) )
    return NULL;

  PySurfaceObject* c_surface = (PySurfaceObject*) py_surface;
  SDL_FillRect( c_surface->surf, 0, SDL_MapRGB(c_surface->surf->format, 255, 0, 0) );

  return Py_None;
}

PyMethodDef methods[] = {

  {"fill_surface", fill_surface, METH_VARARGS, "Paints surface red"},
  {NULL, NULL, 0, NULL},
};

void initred()
{
  Py_InitModule("red", methods);
}

ビルド用 Makefile (Linux):

SOURCES = red.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = red.so

CFLAGS += -Wall -O2 -g
CFLAGS += $(shell python-config --cflags)
CFLAGS += $(shell sdl-config --cflags)

LDFLAGS += $(shell sdl-config --libs)

all: $(TARGET)

clean:
    $(RM) $(OBJECTS)
    $(RM) $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS) $(LDFLAGS)

$(OBJECTS): Makefile

Python テスト コード:

import pygame
import red

pygame.init()
screen = pygame.display.set_mode( (640, 480) )
red.fill_surface(screen)
pygame.display.update()
pygame.time.delay(3000)
于 2011-04-24T22:49:05.080 に答える
0

「I'm Feeling Lucky」でググってみました。

于 2010-01-31T06:12:19.383 に答える