簡體   English   中英

在我自己的C模塊中使用python模塊的C API

[英]Using a python module's C API in my own C module

這似乎是我想要的,除了我想在另一個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實例。

澄清任何人?

訣竅是編寫普通的Python例程,但在C中。根據需要使用PyImport_ImportModule()PyObject_GetAttr()PyObject_Call()

我用Google搜索了一下“我感到很幸運。”

可以使用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);
}

用於構建的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM