Re: [Vala] Embed Python into Vala, extend Vala with Python



ecir hana wrote:
On Tue, Sep 1, 2009 at 1:14 PM, Jan Hudec<bulb ucw cz> wrote:
The OP does not seem to be. He says "like the example for Lua" and that shows
running lua code from vala.

Yes. And also calling Vala code from Lua. Or Python.

Just to check if I'm on the right track:
- just to run some python from Vala I can use Frederik's code from above
- and to call Vala from Python, I have to, according:
http://docs.python.org/extending/embedding.html#extending-embedded-python
add to Frederik's code the definition of "Py_InitModule()", which in
turn needs "PyMethodDef()" and "PyObject()" and if I don't have to
return anything, that's all because PyMethodDef() could return NULL.

Is this correct, so far?

Yes, except that PyMethodDef is a type, not a function. I have
translated this example to Vala (see attachment). I have put the
bindings into a separate 'python.vapi' file. You can compile with:

$ valac pythondemo.vala -X -lpython2.6 --pkg python --vapidir .

The C compiler emits a warning about 'emb_methods' being constant, but
Vala currently allows short array initialization with structs only for
const arrays.


Best regards,

Frederik
using Python;

static int numargs = 0;

static Python.Object? emb_numargs (Python.Object? self, Python.Object? args) {
        if (!Python.arg_parse_tuple (args, ":numargs")) {
        return null;
        }
        return Python.build_value ("i", numargs);
}

const MethodDef[] emb_methods = {
        { "numargs", emb_numargs, MethodFlags.VARARGS,
          "Return the number of arguments received by the process." },
        { null, null, 0, null }
};

int main (string[] args) {
        Python.initialize ();

        numargs = args.length;
        Python.init_module ("emb", emb_methods);

        Python.run_simple_string ("""

import emb
print "Number of arguments", emb.numargs()

""");

        Python.finalize ();

        return 0;
}

[CCode (cheader_filename = "python2.6/Python.h")]
namespace Python {

        [CCode (cname = "Py_Initialize")]
        public static void initialize ();
        [CCode (cname = "Py_Finalize")]
        public static void finalize ();
        [CCode (cname = "Py_InitModule")]
        public static void init_module (string name, [CCode (array_length = false, array_null_terminated = 
true)] MethodDef[] methods);
        [CCode (cname = "Py_BuildValue")]
        public static Python.Object build_value (string format, ...);
        [CCode (cname = "PyRun_SimpleString")]
        public static void run_simple_string (string code);
        [CCode (cname = "PyArg_ParseTuple")]
        public static bool arg_parse_tuple (Python.Object arg, string format, ...);

        [SimpleType]
        [CCode (cname = "PyMethodDef")]
        public struct MethodDef {
                [CCode (cname = "ml_name")]
                public string name;
                [CCode (cname = "ml_meth")]
                public CFunction meth;
                [CCode (cname = "ml_flags")]
                public int flags;
                [CCode (cname = "ml_doc")]
                public string doc;
        }

        [CCode (cname = "PyCFunction", has_target = false)]
        public delegate Python.Object? CFunction (Python.Object? self, Python.Object? args);

        [Flags]
        [CCode (cprefix = "METH_", cname = "int")]
        public enum MethodFlags {
                OLDARGS,
                VARARGS,
                KEYWORDS,
                NOARGS,
                O,
                CLASS,
                STATIC,
                COEXIST
        }

        [Compact]
        [CCode (cname = "PyObject")]
        public class Object {
                // TODO
        }
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]