Embedding Python

Pau Freixes pfreixes at gmail.com
Tue Jul 1 08:25:18 EDT 2008


Hi

If PyImport_ExecCodeModule have a two parameteres and second parameter is
PyObject type  why you are make a call with a unsigned char value ?

If you search this function name into Google you will can found some
examples, use for example PyMarshal_ReadObjectFromString or
PyMarshal_ReadObjectFromFile

Bye

On Tue, Jul 1, 2008 at 11:36 AM, Marcin Krol <mrkafk at gmail.com> wrote:

> Hello everyone,
>
> I'm trying to embed Python interpreter in C code, but in a specific way:
> loading compiled bytecode into a memory location and executing it (don't
> ask why, complicated reasons).
>
> PyImport_ExecCodeModule seems like obvious candidate, docs say:
>
> "Given a module name (possibly of the form package.module) and a code
> object read from a Python bytecode file or obtained from the built-in
> function compile(), load the module."
>
> Code:
>
> ---cut---
> #include <Python.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <syslog.h>
> #include <unistd.h>
>
>
> int load_file(char *fname, unsigned char** result)
> {
>  int size = 0;
>  FILE *f = fopen(fname, "rb");
>  if (f == NULL)
>  {
>  *result = NULL;
>  return -1;
>  }
>  fseek(f, 0, SEEK_END);
>  size = ftell(f);
>  *result = (unsigned char *) malloc(size+1);
>  fseek(f, 0, SEEK_SET);
>  size = fread(*result, sizeof(unsigned char), size, f);
>  return size;
> }
>
> int main(int argc, char **argv)
> {
>        int size;
>        unsigned char *python_code;
>        PyObject *mainobj;
>        size = load_file("multiply.pyc", &python_code);
>
>        Py_Initialize();
>        mainobj = PyImport_ExecCodeModule("multiply", (PyObject *)
> python_code);
>        Py_Finalize();
>
> }
> ---cut---
>
> Compiling it following way works fine:
>
> ${CC} testit.c -g -o testit -I/usr/include/python2.4 -lpython2.4 -lm
> -lutil -lpthread -ldl  -L/usr/lib/python2.4/config
>
>
> However, the damn thing crashes on this call:
>
> 33              mainobj = PyImport_ExecCodeModule("multiply", (PyObject
> *) python_code);
> (gdb) n
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x0804e7f6 in PyImport_ExecCodeModuleEx ()
>
> The .pyc file woks just fine in Python interpreter:
>
>  import multiply
>>>> multiply.multiply()
>>>>
>>> The result of 12345 x 6789 : 83810205
> 83810205
>
>>
>>>>
>
> What I am doing wrong? Please help.
>
>
>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
Pau Freixes
Linux GNU/User
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080701/e7b6b5ae/attachment.html>


More information about the Python-list mailing list