Hướng dẫn compile python to c - biên dịch python thành c

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:
cdef public api  foo(double* x):
   x[0] = 0.0
0

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:

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

delorean.pyx:

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

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

Tôi 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.. 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.. 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ó thể nhanh như C không?

Cython có cùng tốc độ như một chương trình C/C ++ được điều chỉnh cẩn thận;Điều chỉnh cẩn thận, Cython ánh xạ trực tiếp đến C/C ++.Tôi đã thực hiện nhiều điểm chuẩn của mã số cấp thấp khi triển khai Sagemath (sử dụng Cython cho một số dòng mã 100k).; carefully tuned, Cython maps directly to C/C++. I've done many benchmarks of low level numerical code when implementing SageMath (which uses Cython for several 100K lines of code).; carefully tuned, Cython maps directly to C/C++. I've done many benchmarks of low level numerical code when implementing SageMath (which uses Cython for several 100K lines of code).; carefully tuned, Cython maps directly to C/C++. I've done many benchmarks of low level numerical code when implementing SageMath (which uses Cython for several 100K lines of code).

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.Cython allows us to compile Python code, the result is dynamic libraries that can be used as python modules too.Cython allows us to compile Python code, the result is dynamic libraries that can be used as python modules too.