Скомпилируйте основную программу Python, используя Cython - PullRequest
71 голосов
/ 24 февраля 2011

У меня есть программа 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 был бы оценен. Спасибо.

Ответы [ 4 ]

137 голосов
/ 26 февраля 2014

Вопреки утверждениям Адама Матана и других, вы можете фактически создать один исполняемый двоичный файл с использованием Cython из чистого файла Python (.py).

Да, Cython предназначен для использования, как указано - как способ упрощения написания модулей расширения C / C ++ для среды выполнения Python CPython.

Но, как намекает нудзо в этом комментарии , вы можете использовать переключатель --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

hello: исполняемый 64-разрядный LSB ELF, 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) run привет ...

$ ./hello

Hello World!

Как видитеИспользуя этот метод, вы можете в основном использовать Cython для преобразования ваших чистых Python-приложений в исполняемый, скомпилированный объектный код.

Я использую этот метод для значительно более сложных приложений - например, для полноценного Python / PySide / Qtapplication.

Для различных версий Python вы настраиваете gcc -I и -l в соответствии с требованиями.

Затем вы можетеупакуйте исполняемый файл в файл дистрибутива (.deb и т. д.), не упаковывая файлы Python / PySide / Qt - преимущество заключается в том, что ваше приложение должно работать даже после обновления дистрибутива до тех же версий Pythonи т. д. в этом распределении.

17 голосов
/ 24 февраля 2011

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

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

3 голосов
/ 14 декабря 2015

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

0 голосов
/ 24 февраля 2011

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

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

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

...