Trái ngược với những gì Adam Matan và những người khác khẳng định, trên thực tế bạn có thể tạo một tệp nhị phân thực thi duy nhất bằng Cython, từ một tệp Python (.py) thuần túy.
Có, Cython nhằm mục đích được sử dụng như đã nêu - như một cách đơn giản hóa việc viết các mô-đun mở rộng C / C ++ cho thời gian chạy python CPython.
Tuy nhiên, như nudzo ám chỉ trong nhận xét này , bạn có thể sử dụng công --embed
tắc tại dấu nhắc dòng lệnh.
Đây là một ví dụ cực kỳ đơn giản. Tôi đang thực hiện điều này từ một máy trạm Debian Sid, sử dụng python3 và cython3 ..
Hãy chắc chắn rằng bạn có cài đặt gói python-dev hoặc python3-dev trước đó.
1) Tạo một chương trình Python rất đơn giản có tên hello.py
$ cat hello.py
print ("Xin chào Thế giới!")
2) Sử dụng Cython để biên dịch chương trình python của bạn thành C ...
cython3 --embed -o hello.c hello.py
3) Sử dụng GCC để biên dịch hello.c thành một tệp thực thi được gọi là hello ...
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) Bạn kết thúc với một tệp có tên hello ...
$ file xin chào
xin chào: ELF 64-bit LSB thực thi, x86-64, phiên bản 1 (SYSV), được liên kết động (sử dụng các lib được chia sẻ), dành cho GNU / Linux 2.6.32, BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, không bị tước
$ ldd hello
linux-vdso.so.1 (0x00007fff273fe000)
libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
Trong trường hợp này, tệp thực thi được liên kết động với Python 3.3 trên hệ thống Debian của tôi.
5) chạy xin chào ...
$ ./hello
Chào thế giới!
Như bạn có thể thấy, sử dụng phương pháp này về cơ bản, bạn có thể sử dụng Cython để chuyển đổi các ứng dụng Python thuần túy của mình thành mã đối tượng được biên dịch, thực thi.
Tôi đang sử dụng phương pháp này cho các ứng dụng phức tạp hơn rất nhiều - ví dụ: ứng dụng Python / PySide / Qt hoàn chỉnh.
Đối với các phiên bản Python khác nhau, bạn điều chỉnh gcc -I
và -l
công tắc cho phù hợp.
Sau đó, bạn có thể đóng gói tệp thực thi dưới dạng tệp phân phối (.deb, v.v.), mà không cần phải đóng gói tệp Python / PySide / Qt - ưu điểm là ứng dụng của bạn vẫn có thể chạy ngay cả sau khi cập nhật phân phối lên cùng phiên bản Python, v.v. trên bản phân phối đó.