Παιδιά προσπαθώ να βγάλω μια άκρη.
Προσπάθησα να φτιάξω ένα module σε C και να το κάνω compile έτσι ώστε να τρέχει σε python.
C Source Code:
#include <Python.h>
int show(char *msg)
{
int i = 0;
while (msg[i] != '\0'){
printf("%c", msg[i]);
i++;
}
return i;
}
static PyObject *show_wrapper(PyObject* self, PyObject* args)
{
char *msg;
if ( !PyArg_ParseTuple(args, "s", &msg) ){
return NULL;
}
return Py_BuildValue("i", show(msg) );
}
static PyMethodDef myMethods[] =
{
{"sh", show_wrapper, METH_VARARGS, "Print a message."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initshow(void)
{
(void) Py_InitModule("show", myMethods);
}
Setup.py Code:
from distutils.core import setup, Extension
module = Extension(
"show",
sources = ['showmodule.c']
)
setup(
name = "Show Package",
version = "1.0",
description = "Description",
ext_modules = [module]
)
Προσπάθησα να εκτελέσω:
python setup.py build --compiler=mingw32
αλλά δεν δούλευε με python 3.6 . Τελικά έψαξα και βρήκα ότι για να κάνεις build ένα python extension module πρέπει να το κάνεις με python2.
Τελικά το έκανα με python2 και έγινε μια χαρά. Το θέμα είναι ότι το module show γίνεται κανονικά import από python 2 και δουελέυει κανονικά ως εξής:
import show
show.sh("Hello World")
αλλά σε python 3.6 δεν δουλεύει, με λέει ότι:
ImportError: DLL load failed: The specified module could not be found.
Το έψαξα και βρήκα ότι αυτό συμβαίνει διότι το module extension έχει γίνει compile για να δουλεύει σε 32 bits ενώ η python 3.6 είναι σε 64.
Επίσης είδα ότι σε unix συστήματα το module έχει την κατάληξη .so ενώ σε windows .pyd .
Δηλαδή, κάθε φορά που κάνω ένα extesional module θα πρέπει να το κάνω compile για linux και για windows και επιπλέον σε 32 ή 64 bits και ο κάθε ένας θα πρέπει να έχει αυτό που υποστηρίζει;
Πως δηλαδή μετά θα φτιάξω ένα πρόγραμμα σε python που θα κάνει import αυτό το module που έφτιαξα και θα τρέχει και σε linux και σε windows αλλά και σε 32 ή 64 bits.