我有一个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文件创建'C'文件然后编译它们),但是我可以将我的主Python程序编译成可以在Linux平台上执行的程序吗?如果是这样,将欣赏Cython命令行示例.谢谢.
与Adam Matan和其他人断言的相反,您实际上可以使用Cython从纯Python(.py)文件创建单个可执行二进制文件.
是的,Cython旨在按照规定使用 - 作为简化为CPython python运行时编写C/C++扩展模块的一种方法.
但是,正如nudzo在此评论中提到的那样,您可以--embed
在命令行提示符下使用该开关.
这是一个非常简单的例子.我正在使用python3和cython3从Debian Sid工作站执行此操作.
确保预先安装了python-dev或python3-dev软件包.
1)创建一个名为hello.py的非常简单的Python程序
$ cat 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的文件...
$ file你好
你好: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)
在这种情况下,可执行文件动态链接到我的Debian系统上的Python 3.3.
5)跑你好 ...
$ ./hello
你好,世界!
如您所见,使用此方法您基本上可以使用Cython将纯Python应用程序转换为可执行的编译对象代码.
我正在将这种方法用于更复杂的应用程序 - 例如,一个完整的Python/PySide/Qt应用程序.
对于不同版本的Python,您可以定制gcc -I
和-l
switch以适应.
然后,您可以将可执行文件打包为分发(.deb等)文件,而无需打包Python/PySide/Qt文件 - 优点是您的应用程序即使在分发更新后也仍然可以运行该发行版上的Python等版本.
看看Can Cython编译成EXE的答案?与此处的所有其他答案相反,是的,可以编译为可执行文件.
嵌入式Cython的链接似乎是一个很好的起点,但它不是Cython的主要目的,所以我不知道它会有多么简单.