Khác xa với một chuyên gia C nhưng đối với tôi sử dụng Ubuntu, các tác phẩm sau:
main.c:
#include "foo_api.h"
#include
int main[int argc, char *argv[]] {
Py_Initialize[];
initfoo[];
import_foo[];
double arr[5] = {1,2,3,4,5};
int i = 0;
foo[arr];
for[i = 0; i < 5; i++]
{
printf["%f\n", arr[i]];
}
Py_Finalize[];
return 0;
}
foo.pyx:
cdef public api foo[double* x]:
x[0] = 0.0
Từ cùng một thư mục:
$ cython foo.pyx
Then:
$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -o foo *.c -lpython2.7
Sau đó, chỉ cần chạy.
$ ./foo
0.000000
2.000000
3.000000
4.000000
5.000000
Tôi đã sử dụng
cdef public api foo[double* x]:
x[0] = 0.0
8 để lấy cờ: $ pkg-config --cflags python
-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7
Không gọi py_initialize [khởi tạo trình thông dịch python. Trong một ứng dụng nhúng python, điều này nên được gọi trước khi sử dụng bất kỳ chức năng API Python/C nào khác;], Bạn sẽ nhận được:
Fatal Python error: PyThreadState_Get: no current thread
Aborted [core dumped]
Không có
cdef public api foo[double* x]:
x[0] = 0.0
9 hoặc $ cython foo.pyx
0 Bạn nhận được: Segmentation fault [core dumped]
Nếu bạn không gọi py_finalize:
$ cython foo.pyx
1 A NO-OP khi được gọi lần thứ hai [mà không gọi py_finalize [] trước tiên].Để lấy ví dụ DeLorean từ các tài liệu để chạy:
main.py:
#include "delorean_api.h"
#include
Vehicle car;
int main[int argc, char *argv[]] {
Py_Initialize[];
initdelorean[];
import_delorean[];
car.speed = atoi[argv[1]];
car.power = atof[argv[2]];
activate[&car];
Py_Finalize[];
return 0;
}
delorean.pyx:
ctypedef public struct Vehicle:
int speed
float power
cdef api void activate[Vehicle *v]:
if v.speed >= 88 and v.power >= 1.21:
print "Time travel achieved"
else:
print["Sorry Marty"]
Quy trình này là như nhau, thay đổi duy nhất là tôi phải sử dụng
$ cython foo.pyx
2 với cấu trúc xe hoặc cách khác trong chính hoặc sử dụng tôi đã sử dụng $ cython foo.pyx
3 trong chính:cdef public api foo[double* x]:
x[0] = 0.0
0Bạn cũng có thể làm cho nó hoạt động mà không cần sử dụng
$ cython foo.pyx
1, v.v.Trong
$ cython foo.pyx
5 bạn chỉ cần công khai chức năng: cdef public api foo[double* x]:
x[0] = 0.0
1Tôi đã thêm
$ cython foo.pyx
6 chỉ nhập $ cython foo.pyx
7in Main.c và xóa $ cython foo.pyx
8, v.v. Chỉ cần nhập $ cython foo.pyx
9 sẽ không hoạt động cho tôi nhưng đó có thể không phải là trường hợp của mọi người.cdef public api foo[double* x]:
x[0] = 0.0
2Biên dịch là như nhau:
cdef public api foo[double* x]:
x[0] = 0.0
3Nếu bạn đang sử dụng phiên bản API thì chỉ cần bao gồm tiêu đề API hoặc ngược lại theo tài liệu, tuy nhiên, lưu ý rằng bạn nên bao gồm tên modulename.h hoặc modulename_api.h trong một tệp C đã cho, không phải cả hai định nghĩa.
Để làm điều tương tự với ví dụ DeLorean, tôi đã phải sử dụng
$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -o foo *.c -lpython2.7
0 để in các chuỗi để tránh lỗi phân đoạn:cdef public api foo[double* x]:
x[0] = 0.0
4main:
cdef public api foo[double* x]:
x[0] = 0.0
5Có thể có ý nghĩa hơn khi trả về các giá trị:
cdef public api foo[double* x]:
x[0] = 0.0
6main:
cdef public api foo[double* x]:
x[0] = 0.0
7