与Adam Matan和其他人断言的相反,实际上您可以使用Cython从纯Python(.py)文件创建一个可执行二进制文件。
是的,Cython旨在按规定使用-一种简化为CPython python运行时编写C / C ++扩展模块的方式。
但是,正如nudzo在此注释中所暗示的那样,您可以--embed
在命令行提示符下使用该开关。
这是一个非常简单的示例。我正在使用python3和cython3在Debian Sid工作站上执行此操作。
确保事先安装了python-dev或python3-dev软件包。
1)创建一个非常简单的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的文件...
$文件你好
你好: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)运行你好...
$ ./您好
你好,世界!
如您所见,使用这种方法,您基本上可以使用Cython将纯Python应用程序转换为可执行的,已编译的目标代码。
我将这种方法用于非常复杂的应用程序,例如,功能完善的Python / PySide / Qt应用程序。
对于不同版本的Python,您可以定制gcc-I
和-l
开关以适合。
然后,您可以将可执行文件打包为分发文件(.deb等),而不必打包Python / PySide / Qt文件-优点是即使将分发文件更新为相同版本,您的应用程序仍应能够运行该发行版上的Python版本等。