Cython --embed flag in setup.py
Asked Answered
P

1

18

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

Patin answered 19/10, 2017 at 6:50 Comment(6)
Don't think the answer is good enough to justify flagging as a duplicate, but it might be useful #31307669Vena
Hi @DavidW. I tried that route, and I can get a compilable main .c file. However, the cythonize method still produces a non-standalone main.so file. If I compile the produced main.c it works. I'm dashing through the docs, but I don't know what I'm missing...Patin
@Patin Same issue.Allelomorph
I only know how to do this on windows. but you can put all of your cmd instructions in a .bat file and than just call that fileCloison
create a bash file with your 3 commands ?Prismatic
You can use the subprocess module (docs.python.org/3/library/subprocess.html) to execute shell commands.Romola
W
1

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.

Wing answered 5/11, 2022 at 4:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.