Ответ 1
В отличие от того, что утверждает Адам Матан и другие, вы можете создавать один исполняемый двоичный файл с помощью Cython из чистого файла Python (.py).
Да, Cython предназначен для использования как указано - как способ упрощения написания модулей расширения C/С++ для среды выполнения python CPython.
Но, поскольку nudzo ссылается на этот comment, вы можете использовать переключатель --embed
в командной строке.
Вот очень простой пример. Я делаю это с рабочей станции Debian Sid, используя python3 и cython3..
Убедитесь, что у вас установлены пакеты python-dev или python3-dev.
1) Создайте очень простую программу Python под названием hello.py
$cat hello.py
print ( "Hello World!" )
2) Используйте Cython для компиляции вашей программы python в C...
cython3 --embed -o hello.c hello.py
3) Используйте GCC для компиляции hello.c в исполняемый файл hello...
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) В итоге вы получите файл с именем hello...
$file hello
привет: ELF 64-разрядный исполняемый файл LSB, x86-64, версия 1 (SYSV), динамически связан (использует общие библиотеки), для GNU/Linux 2.6.32, BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, не раздевается
$ 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)
В этом случае исполняемый файл динамически связан с Python 3.3 в моей системе Debian.
5) запустите привет...
$./hello
Привет, мир!
Как вы можете видеть, используя этот метод, вы можете в основном использовать Cython для преобразования ваших чистых приложений Python в исполняемый, скомпилированный объектный код.
Я использую этот метод для более сложных приложений - например, полномасштабное приложение Python/PySide/Qt.
Для разных версий Python вы настраиваете переключатели gcc -I
и -l
.
Затем вы можете упаковать исполняемый файл в виде файла дистрибутива (.deb и т.д.) без необходимости упаковывать файлы Python/PySide/Qt - преимущество в том, что ваше приложение все равно сможет работать даже после обновления дистрибутива к тем же версиям Python и т.д. в этом дистрибутиве.