使用Cython编译主Python程序

我有一个Python2.6程序,可以使用Cython加载编译为.so文件的Python模块。 我使用Cython将.py模块编译为.so文件,一切正常。

这是我用于Cython的setup.py文件:

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 ) 

所以我知道我可以使用Cython编译Python模块(我猜Cython从我的Python文件中创build“C”文件,然后编译它们),但是我可以编译我的主Python程序到我可以在Linux平台上执行的东西吗? 如果是这样,一个Cython命令行的例子将不胜感激。 谢谢。

与Adam Matan和其他人所说的相反,事实上,您可以使用纯Python(.py)文件中的Cython创build一个可执行的二进制文件。

是的,Cython旨在用作陈述 – 作为简化为CPython python运行时编写C / C ++扩展模块的一种方法。

但是,正如nudzo在这个评论中暗示的那样,你可以在命令行提示符下使用--embed开关。

这是一个非常简单的例子。 我正在使用python3和cython3从Debian Sid工作站执行此操作。

确保事先安装了python-devpython3-dev软件包。

1)创build一个非常简单的Python程序hello.py

$猫hello.py

打印(“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的文件…

$文件你好

hello:对于GNU / Linux 2.6.32,BuildID [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23,ELF 64位LSB可执行文件,x86-64,版本1(SYSV),dynamic链接(使用共享库)

 $ 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) 

在这种情况下,可执行文件被dynamic链接到我的Debian系统上的Python 3.3。

5)你好

$ ./hello

你好,世界!

正如你所看到的,使用这种方法,你基本上可以使用Cython把你的纯Python应用程序转换成可执行的,编译的目标代码。

我正在使用这种方法来处理更复杂的应用程序 – 例如,一个完整的Python / PySide / Qt应用程序。

对于Python的不同版本,可以定制适合的gcc -I-l开关。

然后,您可以将可执行文件打包为分发(.deb等)文件,而无需打包Python / PySide / Qt文件 – 这样做的好处是,即使在分发更新之后,应用程序仍应能够运行Python的版本等等。

看看可以Cython编译为EXE的答案吗? 这与所有其他答案相反,在这里说是的,可以编译成可执行文件。

Embedding Cython的链接似乎是一个很好的开始,但这不是Cython的主要目的,所以我不知道它会是多么简单。

我不知道这是否会有帮助,但Nudzo是正确的。 你可以用cython --embed -o main.o main.py来得到它,然后我试着用cl / EHsc来编译结果

你不能,Cython不能编译Python,也不能把它变成可执行文件。

要生成.exe文件,请使用py2exe 。

要为Mac或Linux生成一个包,请使用正常的打包系统过程,因为在Unix env中没有关于脚本语言程序的具体内容。