Cython可以编译成EXE吗?

56

我知道Cython的目的是什么。它是用一种类似于Python的语言编写可以编译为C扩展,以便在您的代码中产生加速效果。但我想知道的是(即使使用谷歌搜索也找不到),Cython是否可以以可执行格式编译,因为它似乎已将Python代码转换为C。

我已经使用过Py2Exe,它只是一个打包工具,但我有兴趣将其用于编译成难以解包的东西(使用Py2EXE打包的任何内容基本上都可以使用7zip解压缩,而我不希望这样)。

如果这是可能的话,那么我的下一个选择就是编译所有代码并将其作为模块加载,然后使用py2exe打包,这至少可以将我的大部分代码编译为可执行形式,对吗?


4个回答

46

这里是嵌入cython的维基页面

假设您已将python安装在C:\Python31,并且您想使用Microsoft编译器。

smalltest1.py - 是要编译的文件。

test.exe - 可执行文件的名称。

您需要设置cl的环境变量。

C:\Python31\python.exe C:\Python31\Scripts\cython.py smalltest1.py --embed

cl.exe  /nologo /Ox /MD /W3 /GS- /DNDEBUG -Ic:\Python31\include -Ic:\Python31\PC /Tcsmalltest1.c /link /OUT:"test.exe" /SUBSYSTEM:CONSOLE /MACHINE:X86 /LIBPATH:c:\Python31\libs /LIBPATH:c:\Python31\PCbuild

哇,它运行得非常好。最后生成的.exe文件真的很小。这确实类似于py2execython2exe!我们能否编写一个脚本来自动完成这个过程(根据当前安装的Python版本进行适配等)?我们需要将哪些文件与此.exe文件一起发布? - Basj
我收到了错误信息 忽略未知选项 /main.c缺少源文件名 - the_prole
从哪里获取cython.py文件? - user13107
cl.exe是什么? - mrid
Microsoft C++编译器 - Aftershock

30

从原则上看,根据Embedding Pyrex HOWTO (Pyrex 实际上是 Cython 的前一代)的说法,似乎可以做到你想要的事情。

嗯...这个名字提示我重新搜索一下:“embedding cython”导致这个页面,听起来像是你想要的。


5
请参考我在此处提供的 示例,了解如何在Linux系统上做到这一点。 - Broken Man

4

我已经成功地使用了Cython和gcc将*.py文件转换为*.exe,以下是批处理文件:

# build.bat
set PROJECT_NAME=test
set PYTHON_DIR=C:\python27
%PYTHON_DIR%\python -m cython --embed -o %PROJECT_NAME%.c %PROJECT_NAME%.py
gcc -Os -I %PYTHON_DIR%\include -o %PROJECT_NAME%.exe %PROJECT_NAME%.c -lpython27 -lm -L %PYTHON_DIR%\libs

1
Aftershock的回答很好,我想说的是如何在没有控制台的情况下运行应用程序。如果你想让你的应用程序在没有控制台的情况下运行,有两个重要点:
  1. 将由cython --embed创建的“.c”文件中的所有main()函数替换为wmain()
  2. cl.exe ...命令的末尾添加/subsystem:windows /entry:wmainCRTStartup

确实非常有用!确实需要/subsystem:windows /entry:wmainCRTStartup(对我来说第1个不是必需的)。 - Basj
如何使用gcc(mingw64)做相同的事情? - 0xB00B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接