면책 조항 : 다음 예제는 Python Cookbook (O'Reilly)에서 가져 왔습니다.Cython 확장 기능 작성 : Python에서 내부 구조체에 C 구조체를 액세스하는 방법?
의 내가 있다고 가정 해 봅시다 간단한 struct
다음 두 Point
들 사이의 유클리드 거리를 계산하는 기능
typedef struct {
double x,y;
} Point;
:
extern double distance(Point* p1, Point* p2);
을이 모든 공유 라이브러리의 일부 points
라고 :
points.h
- 헤더 파일points.c
- 소스 파일libpoints.so
- 라이브러리 파일 (IT에 대한 사이 썬 확장 링크) 내가 (
pypoints.py
라고합니다) 내 포장 파이썬 스크립트를 생성 한
:
을#include "Python.h"
#include "points.h"
// Destructor for a Point instance
static void del_Point(PyObject* obj) {
// ...
}
// Constructor for a Point instance
static void py_Point(PyObject* obj) {
// ...
}
// Wrapper for the distance function
static PyObject* py_distance(PyObject* self, PyObject* arg) {
// ...
}
// Method table
static PyMethodDef PointsMethods[] = {
{"Point", py_Point, METH_VARARGS, "Constructor for a Point"},
{"distance", py_distance, METH_VARARGS, "Calculate Euclidean distance between two Points"}
}
// Module description
static struct PyModuleDef pointsmodule = {
PyModuleDef_HEAD_INIT,
"points", // Name of the module; use "import points" to use
"A module for working with points", // Doc string for the module
-1,
PointsMethods // Methods provided by the module
}
이것은 단지 예일뿐입니다. 위의 struct
및 기능에 대해서는 ctypes
또는 cffi
을 쉽게 사용할 수 있지만 Cython 확장을 작성하는 방법을 배우고 싶습니다. setup.py
은 여기에 필요하지 않으므로 게시 할 필요가 없습니다.
이제 당신이 볼 수있는 위의 생성자는 우리가
import points
p1 = points.Point(1, 2) # Calls py_Point(...)
p2 = points.Point(-3, 7) # Calls py_Point(...)
dist = points.distance(p1, p2)
그것은 잘 작동 할 수 있습니다. 그러나 실제로 구조의 Point
내부에 액세스하려면 어떻게해야합니까? 예를 들어 우리가 쉽게
struct
회원
public
이다 말할 수 있음)
struct
내부에 직접 액세스 할 수 있습니다 알다시피 나는
print("p1(x: " + str(p1.x) + ", y: " + str(p1.y))
을 얼마나
Point p1 = {.x = 1., .y = 2.};
printf("p1(x: %f, y: %f)", p1.x, p1.y)
getter 및 setter없이 Python 클래스 멤버 (self.x
, self.y
)에 액세스 할 수도 있습니다.
double x(Point* p);
double y(Point* p);
그러나 나는 방법의 표 안에 자신의 전화를 설명하기 위해 이러한 방법을 포장하는 방법을 확실하지 오전 :
나는 중간 단계의 역할 기능을 쓸 수 있습니다.
어떻게하면됩니까? 내가 Point
구조의 x
을 얻기위한 간단한 p1.x
을 갖고 싶습니다.
'double x (Point * p);'는'Point'에 대한 포인터를 인수로 취하고'double'을 반환하는'x'라는 함수의 함수 선언입니다 - 그래서 당신은 랩 (및 쓰기). y 함수와 마찬가지로. – martineau
'p1.x'와'p1.y' 표기법 Python을 사용하기 위해서,'Point'와 같은 클래스가 주어지면'x'라는 이름의 속성과'x'라는 속성을위한 속성을 만들 수 있습니다. y '. Cython에 속성을 구현할 수 있는지 확실하지 않습니다. – martineau