test
├── build
│ └── test
├── build.sh
├── main.c
└── test
├── common
│ └── util.py
└── hello.py
#!/bin/bash
set -e
#Cythonize manually
cython -3 -o build/test/hello.c test/hello.py
cython -3 -o build/test/common/util.c test/common/util.py
gcc -c -Os -I /usr/include/python3.13 -o build/test/hello.o build/test/hello.c
gcc -c -Os -I /usr/include/python3.13 -o build/test/common/util.o build/test/common/util.c
gcc -c -Os -I /usr/include/python3.13 -o build/main.o main.c
# Build
gcc -Os -o hello build/main.o build/test/hello.o build/test/common/util.o -lpython3.13 -lpthread -lm -lutil -ldl
#include <Python.h>
extern PyObject* PyInit_hello(void);
extern PyObject* PyInit_util(void);
int main(int argc, char *argv[]) {
PyImport_AppendInittab("hello", PyInit_hello);
PyImport_AppendInittab("util", PyInit_util);
Py_Initialize();
PyObject *util_mod = PyImport_ImportModule("util");
PyDict_SetItemString(PyImport_GetModuleDict(), "test.common.util", util_mod);
PyObject *mod = PyImport_ImportModule("hello");
if (!mod) {
PyErr_Print();
return 1;
}
Py_DECREF(util_mod);
Py_DECREF(mod);
Py_Finalize();
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
test/hello.py:
--------------------------------------------------------
import pandas as pd
from test.common.util import helper
def test():
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
print(df)
print("hello world")
test()
helper()
------------------------------------------------------------------------------------------------------------------------------------
test/common/util.py:
--------------------------------------
def helper():
print("help")
-------------------------------------------------------------------------------------------------------------------------------------