Hướng dẫn how do i convert cython to c in python? - làm cách nào để chuyển đổi cython thành c trong python?

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
0

Bạ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
1

Tô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
2

Biên dịch là như nhau:

cdef public api  foo(double* x):
   x[0] = 0.0
3

Nế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
4

main:

cdef public api  foo(double* x):
   x[0] = 0.0
5

Có thể có ý nghĩa hơn khi trả về các giá trị:

cdef public api  foo(double* x):
   x[0] = 0.0
6

main:

cdef public api  foo(double* x):
   x[0] = 0.0
7

Chúng ta có thể chuyển đổi mã Python thành C không?

Mã Python có thể thực hiện các cuộc gọi trực tiếp vào các mô -đun C.Các mô -đun C này có thể là thư viện C chung hoặc thư viện được xây dựng đặc biệt để hoạt động với Python.Cython tạo ra loại mô -đun thứ hai: các thư viện C nói chuyện với nội bộ của Python và có thể được gói với mã Python hiện có.. Those C modules can be either generic C libraries or libraries built specifically to work with Python. Cython generates the second kind of module: C libraries that talk to Python's internals, and that can be bundled with existing Python code.

Cython có biên dịch thành C không?

Lệnh Cython lấy a.py hoặc.Tệp PYX và biên dịch nó vào tệp C/C ++.

Cython có sử dụng C hoặc C ++ không?

Cython có thể gọi vào cả mã C và C ++ và thậm chí các lớp C ++ lớp con.Tuy nhiên, hỗ trợ C ++ có phần hạn chế, cho thấy ngôn ngữ C ++ phức tạp như thế nào., and even subclass C++ classes. The C++ support is somewhat limited, though, given how complex the C++ language is.

Cython có thể biên dịch tất cả mã Python không?

Cython là một trình biên dịch tĩnh cho các ngôn ngữ lập trình Python và Cython, nó đơn giản hóa công việc viết các phần mở rộng Python C.Cython cho phép chúng tôi biên dịch mã Python, kết quả là các thư viện động cũng có thể được sử dụng làm mô -đun Python.Cython allows us to compile Python code, the result is dynamic libraries that can be used as python modules too.