Скомпилируйте основную программу Python с помощью Cython - программирование
Подтвердить что ты не робот

Скомпилируйте основную программу Python с помощью Cython

У меня есть программа Python2.6, которая может загружать модули Python, скомпилированные в .so файлы, используя Cython. Я использовал Cython для компиляции модулей .py в файлы .so, и все работает нормально.

Это файл setup.py, который я использую с Cython:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("ldap", ["ldap.pyx"]),
    Extension("checker", ["checker.pyx"]),
    Extension("finder", ["finder.pyx"]),
    Extension("utils", ["utils.pyx"]),
]

setup(
  name = 'bchecker',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

Итак, я знаю, что могу скомпилировать модули Python с помощью Cython (я думаю, Cython создает файлы C из моих файлов Python, а затем компилирует их), но могу ли я скомпилировать мою основную программу Python с тем, что я могу выполнить на платформе Linux? Если это так, будет оценен пример командной строки Cython. Спасибо.

4b9b3361

Ответ 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 и т.д. в этом дистрибутиве.

Ответ 2

Взгляните на ответы Может ли Cython скомпилировать EXE?, который, вопреки всем другим ответам здесь, говорит, что да, можно скомпилировать исполняемый файл.

Ссылки на Вложение Cython, кажется, хорошее место для начала, но это не основная цель Cython, поэтому я не знаю, как это было бы просто.

Ответ 3

Я не знаю, поможет ли это или нет, но Нудзо прав. Вы можете получить его с помощью cython --embed -o main.o main.py, а затем я попытаюсь скомпилировать результат с помощью cl/EHsc

Ответ 4

Вы не можете, Cython не создан для компиляции Python и не превращает его в исполняемый файл.

Чтобы создать файл .exe, используйте py2exe.

Чтобы создать пакет для Mac или Linux, используйте системный процесс regulard, поскольку в Unix env нет ничего конкретного о языковой программе script.