Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cython --embed flag in setup.py

I am starting to compile my Python 3 project with Cython, and I would like to know if it's possible to reduce my current compile time workflow to a single instruction.

This is my setup.py as of now:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [
    Extension("v", ["version.py"]),
    Extension("*", ["lib/*.py"])
]

setup(
    name = "MyFirst App",
    ext_modules = cythonize(extensions),
)

And this is what I run from shell to obtain my executables:

python3 setup.py build_ext --inplace
cython3 --embed -o main.c main.py
gcc -Os -I /usr/include/python3.5m -o main main.c -lpython3.5m -lpthread -lm -lutil -ldl

This whole process works just fine, I'd like to know if there is a way to also embed the last two instruction in the setup.py script.

Thank you

like image 741
Guerriky Avatar asked Dec 09 '25 02:12

Guerriky


1 Answers

Start off with checking out the docs for the utility you're using. If there are complicated arguments, there is probably a config file.

This should tidy up your first command:

# setup.cfg
[build_ext]
inplace=1

I don't see anything in the docs about a post-build step, and I wouldn't really expect this process to execute shell commands afterwards. build_ext is for building python. make is very available and usual for building C binaries.

Add a Makefile to your project. If you have gccinstalled, you likely have make already:

# Makefile (lines need to start with tab)

compile:
    python3 setup.py build_ext --inplace
    cython3 --embed -o main.c main.py
    gcc -Os -I /usr/include/python3.5m -o main main.c -lpython3.5m -lpthread -lm -lutil -ldl

Now you can just type make or make compile to get the desired affect.

like image 51
trevorgrayson Avatar answered Dec 11 '25 16:12

trevorgrayson