使用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-dev或python3-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中没有关于脚本语言程序的具体内容。