Can Cython compile to an EXE?
Question:
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?
Answers:
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.
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:Python31python.exe C:Python31Scriptscython.py smalltest1.py --embed
cl.exe /nologo /Ox /MD /W3 /GS- /DNDEBUG -Ic:Python31include -Ic:Python31PC /Tcsmalltest1.c /link /OUT:"test.exe" /SUBSYSTEM:CONSOLE /MACHINE:X86 /LIBPATH:c:Python31libs /LIBPATH:c:Python31PCbuild
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:
-
Replace all the main()
function in the “.c” file made by cython --embed
with wmain()
-
Add /subsystem:windows /entry:wmainCRTStartup
to the end of cl.exe ...
command
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
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?
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.
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:Python31python.exe C:Python31Scriptscython.py smalltest1.py --embed
cl.exe /nologo /Ox /MD /W3 /GS- /DNDEBUG -Ic:Python31include -Ic:Python31PC /Tcsmalltest1.c /link /OUT:"test.exe" /SUBSYSTEM:CONSOLE /MACHINE:X86 /LIBPATH:c:Python31libs /LIBPATH:c:Python31PCbuild
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:
-
Replace all the
main()
function in the “.c” file made bycython --embed
withwmain()
-
Add
/subsystem:windows /entry:wmainCRTStartup
to the end ofcl.exe ...
command
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