56

I know what Cythons purpose is. It's to write compilable C extensions in a Python-like language in order to produce speedups in your code. What I would like to know (and can't seem to find using my google-fu) is if Cython can somehow compile into an executable format since it already seems to break python code down into C.

I already use Py2Exe, which is just a packager, but am interested in using this to compile down to something that is a little harder to unpack (Anything packed using Py2EXE can basically just be extracted using 7zip which I do not want)

It seems if this is not possible my next alternative would just be to compile all my code and load it as a module and then package that using py2exe at least getting most of my code into compiled form, right?

ThantiK
  • 1,582
  • 4
  • 17
  • 31
  • Linked to [Making an executable in Cython](https://stackoverflow.com/questions/22507592/making-an-executable-in-cython) – Basj Jun 15 '20 at 15:25

4 Answers4

46

Here's the wiki page on embedding cython

Assuming you installed python to C:\Python31 and you want to use Microsoft Compiler.

smalltest1.py - is the file you want to compile.

test.exe - name of the executable.

You need to set the environmental variables for 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
evan
  • 3
  • 2
Aftershock
  • 5,205
  • 4
  • 51
  • 64
30

In principal it appears to be possible to do something like what you want, according to the Embedding Pyrex HOWTO. (Pyrex is effectively a previous generation of Cython.)

Hmm... that name suggests a better search than I first tried: "embedding cython" leads to this page which sounds like what you want.

yamm
  • 1,523
  • 1
  • 15
  • 25
Peter Hansen
  • 21,046
  • 5
  • 50
  • 72
  • 5
    Please see my example of how to do exactly that [here](http://stackoverflow.com/a/22040484/2198548) for a Linux system. – Broken Man Feb 26 '14 at 11:58
4

I have successfully used the Cython & gcc to convert the *.py file to *.exe, with below batch file:

# 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
PANDA
  • 41
  • 1
1

Aftershock's answer is good, what I want to say is about run app without console. Most like Aftershock's answer, if you want your application run without console, two points are important:

  1. Replace all the main() function in the ".c" file made by cython --embed with wmain()

  2. Add /subsystem:windows /entry:wmainCRTStartup to the end of cl.exe ... command

Basj
  • 41,386
  • 99
  • 383
  • 673