当前位置:  开发笔记 > 编程语言 > 正文

使用Cython编译主Python程序

如何解决《使用Cython编译主Python程序》经验,为你挑选了2个好方法。

我有一个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命令行示例.谢谢.



1> Broken Man..:

与Adam Matan和其他人断言的相反,您实际上可以使用Cython从纯Python(.py)文件创建单个可执行二进制文件.

是的,Cython旨在按照规定使用 - 作为简化为CPython python运行时编写C/C++扩展模块的一种方法.

但是,正如nudzo在此评论中提到的那样,您可以--embed在命令行提示符下使用该开关.

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

确保预先安装了python-devpython3-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-lswitch以适应.

然后,您可以将可执行文件打包为分发(.deb等)文件,而无需打包Python/PySide/Qt文件 - 优点是您的应用程序即使在分发更新后也仍然可以运行该发行版上的Python等版本.


它不会将模块编译为可执行文件.是否可以使用可移植的可执行文件,即已在源代码中导入的每个模块都将编译为该可执行文件.@BrokenMan
对于python 2.7`cython --embed -o/tmp/ac a.py`和`gcc -Os -I /usr/include/python2.7 -o/tmp/a/tmp/ac -lpython2.7 -lpthread - lm -lutil -ldl`
那个libpython的静态链接怎么样?

2> Scott Griffi..:

看看Can Cython编译成EXE的答案?与此处的所有其他答案相反,是的,可以编译为可执行文件.

嵌入式Cython的链接似乎是一个很好的起点,但它不是Cython的主要目的,所以我不知道它会有多么简单.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有