3

这似乎是我想要的,除了我想在另一个 C 模块中创建一个 C PyObject 的实例。

使用 C API 创建在 python 中声明的 python 类的实例

但是我无法找到使用 C 语言的 Python 模块的文档。我似乎无法在网上找到相关文档,因为每个人都在谈论用 C 扩展 Python。

我的问题是我有一个想要加速的 Pygame。所以我正在制作一个需要访问 Pygame 的 C 模块。如何导入 pygame?我不想导入两个副本,对吗?编码部分我能弄明白,就是不知道怎么配置和链接代码。我知道我一定错过了一些文档,所以如果有人能指出我正确的方向,我将非常感激。


更新:对不起,我重读了我的帖子并意识到我的措辞很糟糕。

如果你安装了 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 包一起安装的问题)。

当 pygame 的下一个版本/构建发布时,针对这种“内部”API 构建的扩展可能会中断,除非 pygame 开发人员关心这些 C 头文件的 API/ABI 兼容性......

无论如何,这是一个例子:

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);
}

用于构建 (Linux) 的 Makefile:

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

我用谷歌搜索了一个“我感觉很幸运”。

于 2010-01-31T06:12:19.383 回答