diff options
| -rw-r--r-- | Makefile.am | 4 | ||||
| -rw-r--r-- | configure.in | 59 | ||||
| -rw-r--r-- | python/Makefile.am | 7 | ||||
| -rw-r--r-- | python/pyzmq.cpp | 756 | ||||
| -rw-r--r-- | python/setup.py.in | 14 | 
5 files changed, 837 insertions, 3 deletions
| diff --git a/Makefile.am b/Makefile.am index 156c97e..c84eda2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@  include_HEADERS = include/zmq.h include/zmq.hpp -SUBDIRS = src examples -DIST_SUBDIRS = src examples +SUBDIRS = src examples python +DIST_SUBDIRS = src examples python diff --git a/configure.in b/configure.in index 932b4dd..fd4ffcf 100644 --- a/configure.in +++ b/configure.in @@ -159,6 +159,59 @@ if test "x$HAVE_INTTYPES_H" = "xyes"; then      inttypes="1"  fi +# Python +pyzmq="no" + +AC_ARG_WITH(python_headersdir, +    AC_HELP_STRING([--with-python-headersdir], [Python.h header file location]), +        [python_headersdir="$withval"], [python_headersdir="no"]) + +AC_ARG_WITH([python], [AS_HELP_STRING([--with-python], [build Python language binding [default=no]])], [with_python=yes], [with_python=no]) +if test "x$with_python" != "xno"; then +    AM_PATH_PYTHON([2.4], , [:]) +    if test "x$PYTHON" = "x:"; then +        AC_MSG_ERROR([To run configure with --with-python option, Python has to be installed.]); +    fi + +    if test "x$python_headersdir" != "xno"; then +        PYTHON_INCLUDES="-I${python_headersdir}" +        PYTHON_SETUP_INCLUDES="${python_headersdir}" + +        AC_CHECK_HEADERS($python_headersdir/Python.h, [] ,  +            [AC_MSG_ERROR([To run configure with --with-python option, Python.h has to be usable.])]) + +    else  +        py_prefix=`$PYTHON -c "import sys; print sys.prefix"` +        py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` +        PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" +        PYTHON_SETUP_INCLUDES="${py_prefix}/include/python${PYTHON_VERSION}" + +        if test "$py_prefix" != "$py_exec_prefix"; then +            PYTHON_INCLUDES="${PYTHON_INCLUDES} -I${py_exec_prefix}/include/python${PYTHON_VERSION}" +        fi + +        AC_CHECK_HEADERS($py_prefix/include/python${PYTHON_VERSION}/Python.h, [] ,  +            [AC_MSG_ERROR([To run configure with --with-python option, Python.h has to be usable.])]) +    fi + +    AC_SUBST(PYTHON_INCLUDES) +    AC_SUBST(PYTHON_SETUP_INCLUDES) + +    pyzmq="yes" +fi + +if test "x$pyzmq" != "xyes"; then +        AC_CHECK_PROG(have_python, python, yes, no) +        if test "x$have_python" != "xyes"; then +            AC_MSG_ERROR([Could not find python.]) +        fi +    fi +     +    #  Generate version.c +    AC_CONFIG_COMMANDS([version.c], +        [python third-party/openpgm/libpgm-1.0.0/openpgm/pgm/version_generator.py > \ +            third-party/openpgm/libpgm-1.0.0/openpgm/pgm/version.c]) +  AC_SUBST(stdint)  AC_SUBST(inttypes) @@ -171,7 +224,8 @@ AC_FUNC_MALLOC  AC_TYPE_SIGNAL  AC_CHECK_FUNCS(perror gettimeofday memset socket getifaddrs freeifaddrs) -AC_OUTPUT(Makefile src/Makefile examples/Makefile examples/chat/Makefile) +AC_OUTPUT(Makefile src/Makefile examples/Makefile examples/chat/Makefile python/Makefile \ +python/setup.py)  AC_MSG_RESULT([])  AC_MSG_RESULT([ ******************************************************** ]) @@ -184,5 +238,8 @@ AC_MSG_RESULT([  license text. ])  AC_MSG_RESULT([ ******************************************************** ])  AC_MSG_RESULT([])  AC_MSG_RESULT([ 0MQ install dir: $prefix]) +AC_MSG_RESULT([   Python language binding: $pyzmq])  AC_MSG_RESULT([]) +AM_CONDITIONAL(BUILD_PYTHON, test "x$pyzmq" = "xyes") + diff --git a/python/Makefile.am b/python/Makefile.am new file mode 100644 index 0000000..effe8b9 --- /dev/null +++ b/python/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/libzmq \ +-I$(top_builddir)/libzmq $(PYTHON_INCLUDES) + +pyexec_LTLIBRARIES = libpyzmq.la +libpyzmq_la_SOURCES = pyzmq.cpp +libpyzmq_la_LIBADD = $(top_builddir)/src/libzmq.la +libpyzmq_la_LDFLAGS = -avoid-version diff --git a/python/pyzmq.cpp b/python/pyzmq.cpp new file mode 100644 index 0000000..019c73c --- /dev/null +++ b/python/pyzmq.cpp @@ -0,0 +1,756 @@ +/* +    Copyright (c) 2007-2009 FastMQ Inc. + +    This file is part of 0MQ. + +    0MQ is free software; you can redistribute it and/or modify it under +    the terms of the Lesser GNU General Public License as published by +    the Free Software Foundation; either version 3 of the License, or +    (at your option) any later version. + +    0MQ is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    Lesser GNU General Public License for more details. + +    You should have received a copy of the Lesser GNU General Public License +    along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <Python.h> + +#include <zmq.hpp> + +struct pyZMQ +{ +    PyObject_HEAD +     +}; + +void pyZMQ_dealloc (pyZMQ *self) +{   + +    self->ob_type->tp_free ((PyObject*) self); +} + +PyObject *pyZMQ_new (PyTypeObject *type, PyObject *args, PyObject *kwdict) +{ +    pyZMQ *self = (pyZMQ*) type->tp_alloc (type, 0); + +    return (PyObject*) self; +} + +PyObject *pyZMQ_term (PyTypeObject *type, PyObject *args, PyObject *kwdict) +{ +    pyZMQ *self = (pyZMQ*) type->tp_alloc (type, 0); +     +    static const char *kwlist [] = {"context", NULL}; +    PyObject *context; +     +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +         &context)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +	int rc = zmq_term ((void *) context); +	assert (rc != 0); +	 +    return (PyObject*) self; +} + +int pyZMQ_init  (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    return 0; +} + +PyObject *pyZMQ_context  (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"app_threads", "io_threads", NULL}; + +    int app_threads; +    int io_threads; +    +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "ii", (char**) kwlist, +         &app_threads, &io_threads)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +        	 +    void *context = zmq_init (app_threads, io_threads); +    if (context == NULL) { +        assert (errno == EINVAL); +        PyErr_SetString (PyExc_ValueError, "Invalid argument"); +    } +     +    return (PyObject*) context; +} + +PyObject *pyZMQ_msg_init (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    zmq_msg *msg; + +    int rc = zmq_msg_init (msg); +	 +	if (rc == -1) { +		assert (rc == ENOMEM); +		PyErr_SetString( PyExc_MemoryError, "Out of memory"); +	} +	 +    return (PyObject*) msg; +} + + +PyObject *pyZMQ_msg_init_size (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"size", NULL}; + +    zmq_msg *msg; +    int size; + +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "i", (char**) kwlist, +          &size)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_msg_init_size (msg, size); +     +    if (rc == -1) { +		assert (rc == ENOMEM); +		PyErr_SetString( PyExc_ValueError, "Out of memory"); +	} +	 +    return (PyObject*) msg; +} + +PyObject *pyZMQ_msg_init_data (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"data", "size", "ffn", NULL}; +     +    PyObject *data = PyString_FromStringAndSize (NULL, 0); +    zmq_msg *msg; +    PyObject *ffn; +    int size; + +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "SiO", (char**) kwlist, +          &data, &size, &ffn)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_msg_init_data (msg, data, size, NULL); +    assert (rc == 0); +     +    return (PyObject*) msg; +} + +PyObject *pyZMQ_msg_close (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"msg", NULL}; +     +    PyObject *msg; +    +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &msg)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_msg_close ((zmq_msg *) msg); +    assert (rc == 0); + +    return (PyObject*) self; +} + +PyObject *pyZMQ_msg_move (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"src", NULL}; +     +    zmq_msg *dest; +    PyObject *src; +    +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &src)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_msg_move (dest, (zmq_msg*) src); +    assert (rc == 0); + +    return (PyObject*) dest; +} + +PyObject *pyZMQ_msg_copy (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"src", NULL}; +     +    PyObject *dest; +    PyObject *src; +    +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &src)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_msg_copy ((zmq_msg*) dest, (zmq_msg*) src); +    assert (rc == 0); +  +    return (PyObject*) dest; +} + +PyObject *pyZMQ_msg_data (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"msg", NULL}; +     +    PyObject *msg; +    PyObject *data = PyString_FromStringAndSize (NULL, 0); +    +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &msg)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +	data = (PyObject *) zmq_msg_data ((zmq_msg *) msg); +  +    return (PyObject*) data; +} + +int pyZMQ_msg_size (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"msg", NULL}; +     +    PyObject *msg; +   	int size; +   	 +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &msg)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +	size = zmq_msg_size ((zmq_msg*) msg); + +    return size; +} + +int pyZMQ_msg_type (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"msg", NULL}; +     +    PyObject *msg; +   	int type; +   	 +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &msg)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +	type = zmq_msg_type ((zmq_msg*) msg); + +    return type; +} + +PyObject *pyZMQ_socket (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"context", "type", NULL}; +    void* context; +    int type; + +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "Oi", (char**) kwlist, +          &context, &type)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +	 +    void *socket = zmq_socket ((void *) context, type); +     +    if (socket == NULL) { +        assert (errno == EMFILE || errno == EINVAL); +        if (errno == EMFILE) +            PyErr_SetString (PyExc_MemoryError, "Too many threads"); +        else +            PyErr_SetString (PyExc_ValueError, "Invalid argument"); +    } + +    return (PyObject*) socket; +} + +PyObject *pyZMQ_close (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"socket", NULL}; +     +    PyObject* socket; +     +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &socket)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + + +    int rc = zmq_close ((void *)socket); +    assert (rc == 0); + +    return (PyObject *) self; +} + +PyObject *pyZMQ_setsockopt (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    static const char *kwlist [] = {"socket", "option", "optval", NULL}; +	printf ("setsockopt\n"); +    PyObject* socket; +    int option; +    PyObject* optval; +    int optvallen; +    int rc; +     +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "OiO", (char**) kwlist, +          &socket, &option, &optval)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +         +	if (PyInt_Check (optval)) +	    rc = zmq_setsockopt ((void *) socket, option, (void *) optval,  +    		4); +	if (PyBool_Check (optval)) +	    rc = zmq_setsockopt ((void *) socket, option, (void *) optval,  +    		1); +	if (PyFloat_Check (optval)) +	    rc = zmq_setsockopt ((void *) socket, option, (void *) optval,  +    		4); +	if (PyString_Check (optval)) +	    rc = zmq_setsockopt ((void *) socket, option, (void *) optval,  +    		PyString_Size (optval));    		 + +    assert (rc == 0); + +    return (PyObject *) self; +} + +PyObject *pyZMQ_bind (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    char const *addr = NULL; +    PyObject* socket; +    +    static const char *kwlist [] = {"socket", "addr", NULL}; + +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "Os", (char**) kwlist,  +        &socket, &addr)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +     +    int rc = zmq_bind ((void*) socket, addr); +	if (rc == -1) { +        assert (errno == EINVAL || errno == EADDRINUSE); +        if (errno == EINVAL) +            PyErr_SetString (PyExc_ValueError, "Invalid argument"); +        else +            PyErr_SetString (PyExc_ValueError, "Address in use"); +    } + +    return (PyObject *) self; +} +PyObject *pyZMQ_connect (pyZMQ *self, PyObject *args, PyObject *kw) +{ +    char const *addr = NULL; +    PyObject* socket; +    +    static const char* kwlist [] = {"socket", "addr", NULL}; + +    if (!PyArg_ParseTupleAndKeywords (args, kw, "Os", (char**) kwlist, +          &socket, &addr))  +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_connect ((void *) socket, addr); +    if (rc == -1) { +        assert (errno == EINVAL || errno == EADDRINUSE); +        if (errno == EINVAL) +            PyErr_SetString (PyExc_ValueError, "Invalid argument"); +        else +            PyErr_SetString (PyExc_ValueError, "Address in use"); +    } + +    return (PyObject *) self; +} + +PyObject *pyZMQ_flush (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ + +	static const char *kwlist [] = {"socket", NULL}; +	PyObject *socket; +	 +	if (!PyArg_ParseTupleAndKeywords (args, kwdict, "O", (char**) kwlist, +          &socket))  +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +         +    int rc = zmq_flush ((void*) socket); +    assert (rc == 0); + +    return (PyObject *) self; +} + +PyObject *pyZMQ_send (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    PyObject *msg; +    PyObject *socket; +    int flags = 0; +   +    static const char *kwlist [] = {"socket", "msg", "flags", NULL}; + +    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "OOi", (char**) kwlist, +          &socket, &msg, &flags)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); +     +    int rc = zmq_send ((void*) socket, (zmq_msg*) msg, flags); +    assert (rc == 0 || (rc == -1 && errno == EAGAIN)); + +    return (PyObject *) self; +} + +PyObject *pyZMQ_receive (pyZMQ *self, PyObject *args, PyObject *kwdict) +{ +    zmq_msg *msg; +    zmq_msg_init (msg); +    PyObject *socket; +     +    int flags = 0; +    static const char *kwlist [] = {"socket", "flags", NULL}; + +    if (!PyArg_ParseTupleAndKeywords (args, kwdict, "Oi", (char**) kwlist, +          &socket, &flags)) +        PyErr_SetString (PyExc_SystemError,  +        	"PyArg_ParseTupleAndKeywords error"); + +    int rc = zmq_recv (socket, msg, flags); +    assert (rc == 0 || (rc == -1 && errno == EAGAIN)); +     +    PyObject *py_message = PyString_FromStringAndSize (NULL, 0); +    py_message = (PyObject *) zmq_msg_data (msg); +    int py_message_size = zmq_msg_size (msg); +    int py_message_type = zmq_msg_type (msg); +     +    zmq_msg_close (msg); +     +    return Py_BuildValue ("isi", rc, py_message, +        py_message_size, py_message_type); +} + +static PyMethodDef pyZMQ_methods [] = +{ +    { +        "context", +        (PyCFunction) pyZMQ_context, +        METH_VARARGS | METH_KEYWORDS,  +        "context (app_threads, io_threads) -> None\n\n" +        "Creates new context\n\n"  +        "app_threads is the number of application threads.\n\n" +        "io_threads is the number of io threads.\n\n" +         +    }, +    { +        "msg_init", +        (PyCFunction) pyZMQ_msg_init, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_init () -> None\n\n" +        "Creates new message\n\n"  +         +    }, +    { +        "msg_init_size", +        (PyCFunction) pyZMQ_msg_init_size, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_init_size (size) -> None\n\n" +        "Creates new message of a specified size.\n\n"  +        "size if integer specifying the size of the message to be created.\n\n" +        +    }, +    { +        "msg_init_data", +        (PyCFunction) pyZMQ_msg_init_data, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_init_data (data, size, ffn) -> None\n\n" +        "Initialises new message with data\n\n" +        "data is pointer to the data of the message\n\n" +        "size is integer specifying size of data\n\n" +        "ffn is function to free alocated data\n\n" +       +    },  +     +     { +        "msg_close", +        (PyCFunction) pyZMQ_msg_close, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_close (msg) -> None\n\n" +        "Deletes the message.\n\n" +        "msg is the message the be freed\n\n" +       +    },  +     { +        "msg_move", +        (PyCFunction) pyZMQ_msg_move, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_move (src) -> dest\n\n" +        "Move the content of the message from 'src' to 'dest'.\n\n" +        "The content isn't copied, just moved. 'src' is an empty\n\n" +        "message after the call. Original content of 'dest' message\n\n" +        "is deallocated.\n\n" +               +    },  +     { +        "msg_copy", +        (PyCFunction) pyZMQ_msg_copy, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_copy (src) -> dest\n\n" +        "Copy the 'src' message to 'dest'. The content isn't copied, \n\n" +        "instead reference count is increased. Don't modify the message \n\n" +        "data after the call as they are shared between two messages.\n\n" +        "Original content of 'dest' message is deallocated.\n\n" +       +    },  +     { +        "msg_data", +        (PyCFunction) pyZMQ_msg_data, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_data (msg) -> data\n\n" +        "Returns pointer to message data.\n\n" +       +    },  +    { +        "msg_size", +        (PyCFunction) pyZMQ_msg_size, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_size (msg) -> size\n\n" +        "Returns size of a message.\n\n" +       +    },  +    { +        "msg_type", +        (PyCFunction) pyZMQ_msg_type, +        METH_VARARGS | METH_KEYWORDS,  +        "msg_type (msg) -> type\n\n" +        "Returns type of a message.\n\n" +       +    },  +    { +        "term", +        (PyCFunction) pyZMQ_term, +        METH_VARARGS | METH_KEYWORDS,  +        "term (context) -> None\n\n" +        "Deinitialise 0SOCKETS context including all the open sockets.\n\n" +        "Closing sockets after zmq_term has been called will result in\n\n" +        "undefined behaviour.\n\n" +       +    },  +    { +        "close", +        (PyCFunction) pyZMQ_close, +        METH_VARARGS | METH_KEYWORDS,  +        "close (socket) -> None\n\n" +        "Close the socket.\n\n" +       +    },  +     +    { +        "socket", +        (PyCFunction) pyZMQ_socket, +        METH_VARARGS | METH_KEYWORDS,  +        "socket (context, type) -> None\n\n" +        "Creates new socket.\n\n"  +        "'context' is a context_t object.\n" +        "'type' is one of 'ZMQ_NOBLOCK', 'ZMQ_NOFLUSH', 'ZMQ_P2P', 'ZMQ_PUB', " +        " 'ZMQ_SUB', 'ZMQ_REQ ZMQ_REP'\n" +    }, +    { +        "setsockopt", +        (PyCFunction) pyZMQ_setsockopt, +        METH_VARARGS | METH_KEYWORDS,  +        "setsockopt (socket, option, value) -> None\n\n" +        "Set socket options." +        "Possible options are: 'ZMQ_HWM', 'ZMQ_LWM', 'ZMQ_SWAP', 'ZMQ_MASK', " +		"'ZMQ_AFFINITY', 'ZMQ_IDENTITY'." +    }, +    { +        "bind", +        (PyCFunction) pyZMQ_bind, +        METH_VARARGS | METH_KEYWORDS,  +        "bind (addr) -> None\n\n" +        "Bind socket to specified address." +    }, +    { +        "connect", +        (PyCFunction) pyZMQ_connect, +        METH_VARARGS | METH_KEYWORDS,  +        "connect (addr) -> None\n\n" +        "connect socket to specified address." +    }, +    { +        "flush", +        (PyCFunction) pyZMQ_flush, +        METH_VARARGS | METH_KEYWORDS,  +        "flush (addr) -> None\n\n" +        "flush " +    }, +    { +        "send", +        (PyCFunction) pyZMQ_send, +        METH_VARARGS | METH_KEYWORDS,  +        "send (message, flags) -> sent\n\n" +        "Send a message to within the socket, " +        "returns integer specifying if the message was sent.\n" +        "'message' is message to be sent.\n" +        "'flags' is integer specifying send options.\n" +    }, +    { +        "receive", +        (PyCFunction) pyZMQ_receive, +        METH_VARARGS | METH_KEYWORDS,  +        "receive (flags) -> (received, message, type)\n\n" +        "Receive a message." +        "'flags' is integer specifying receive options.\n" +        "'message' is string storing the message received.\n" +        "'type' is type of the message received.\n" + +    }, +    { +        NULL +    } +}; + +static const char* pyZMQ_ZMQ_doc =   +    "0MQ messaging session\n\n" +    "Available functions:\n" +    "  context\n" +    "  socket\n" +    "  setsockopt\n" +    "  bind\n" +    "  send\n" +    "  flush\n" +    "  receive\n\n"; + +static PyTypeObject pyZMQType = +{ +    PyObject_HEAD_INIT (NULL) +    0, +    "libpyzmq.Zmq",            /* tp_name (This will appear in the default  +                               textual representation of our objects and  +                               in some error messages)*/ +    sizeof (pyZMQ),            /* tp_basicsize */ +    0,                         /* tp_itemsize */ +    (destructor) pyZMQ_dealloc,/* tp_dealloc */ +    0,                         /* tp_print */ +    0,                         /* tp_getattr */ +    0,                         /* tp_setattr */ +    0,                         /* tp_compare */ +    0,                         /* tp_repr */ +    0,                         /* tp_as_number */ +    0,                         /* tp_as_sequence */ +    0,                         /* tp_as_mapping */ +    0,                         /* tp_hash */ +    0,                         /* tp_call */ +    0,                         /* tp_str */ +    0,                         /* tp_getattro */ +    0,                         /* tp_setattro */ +    0,                         /* tp_as_buffer */ +    Py_TPFLAGS_DEFAULT,        /* tp_flags */ +    (char*) pyZMQ_ZMQ_doc,     /* tp_doc */ +    0,                         /* tp_traverse */ +    0,                         /* tp_clear */ +    0,                         /* tp_richcompare */ +    0,                         /* tp_weaklistoffset */ +    0,                         /* tp_iter */ +    0,                         /* tp_iternext */ +    pyZMQ_methods,             /* tp_methods */ +    0,                         /* tp_members */ +    0,                         /* tp_getset */ +    0,                         /* tp_base */ +    0,                         /* tp_dict */ +    0,                         /* tp_descr_get */ +    0,                         /* tp_descr_set */ +    0,                         /* tp_dictoffset */ +    (initproc) pyZMQ_init,     /* tp_init */ +    0,                         /* tp_alloc */ +    pyZMQ_new,                 /* tp_new */ +}; + +static PyMethodDef module_methods[] = +{ +    { NULL, NULL, 0, NULL } +}; + +#ifndef PyMODINIT_FUNC +#define PyMODINIT_FUNC void +#endif + +static const char* pyZMQ_doc = +    "0MQ Python Module\n\n" +    "Constructor:\n" +    "  z = libpyzmq.Zmq ()\n" +    "Available functions:\n" +	"  context\n" +    "  socket\n" +    "  setsockopt\n" +    "  bind\n" +    "  send\n" +    "  flush\n" +    "  receive\n" +    "\n" +    "For more information see http://www.zeromq.org.\n" +    "\n" +    "0MQ is distributed under GNU Lesser General Public License v3\n"; + +PyMODINIT_FUNC initlibpyzmq (void) +{ +    if (PyType_Ready (&pyZMQType) < 0) +        return; + +    PyObject *m = Py_InitModule3 ("libpyzmq", module_methods, +        (char*) pyZMQ_doc); +    if (!m) +        return; + +    Py_INCREF (&pyZMQType); + +    PyModule_AddObject (m, "Zmq", (PyObject*) &pyZMQType); +     +    PyObject *d = PyModule_GetDict (m); +     +            +	PyObject *t = PyInt_FromLong (ZMQ_NOBLOCK); +    PyDict_SetItemString (d, "ZMQ_NOBLOCK", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_NOFLUSH); +    PyDict_SetItemString (d, "ZMQ_NOFLUSH", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_P2P); +    PyDict_SetItemString (d, "ZMQ_P2P", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_PUB); +    PyDict_SetItemString (d, "ZMQ_PUB", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_SUB); +    PyDict_SetItemString (d, "ZMQ_SUB", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_REQ); +    PyDict_SetItemString (d, "ZMQ_REQ", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_REP); +    PyDict_SetItemString (d, "ZMQ_REP", t); +    Py_DECREF (t); +     +    t = PyInt_FromLong (ZMQ_HWM); +    PyDict_SetItemString (d, "ZMQ_HWM", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_LWM); +    PyDict_SetItemString (d, "ZMQ_LWM", t); +    Py_DECREF (t);         +    t = PyInt_FromLong (ZMQ_SWAP); +    PyDict_SetItemString (d, "ZMQ_SWAP", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_MASK); +    PyDict_SetItemString (d, "ZMQ_MASK", t); +    Py_DECREF (t);         +    t = PyInt_FromLong (ZMQ_AFFINITY); +    PyDict_SetItemString (d, "ZMQ_AFFINITY", t); +    Py_DECREF (t); +    t = PyInt_FromLong (ZMQ_IDENTITY); +    PyDict_SetItemString (d, "ZMQ_IDENTITY", t); +    Py_DECREF (t);         +     +        +} diff --git a/python/setup.py.in b/python/setup.py.in new file mode 100644 index 0000000..f7055d5 --- /dev/null +++ b/python/setup.py.in @@ -0,0 +1,14 @@ +from distutils.core import setup, Extension + +module1 = Extension('libpyzmq',  +    libraries = ['zmq'], +    library_dirs = ['@prefix@/lib'], +    include_dirs = ['@PYTHON_SETUP_INCLUDES@','@prefix@/include'], +    sources = ['pyzmq.cpp']) + +setup (name = 'libyzmq', +    version = '@VERSION@', +    description = '0MQ Python library', +    ext_modules = [module1]) + + | 
