Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2007 16:28:50

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

мистика. python C API + fastcgi

пытаюсь связать сишную либу fasctgi с питоном.

#!/usr/bin/python
import cpfcgi,os
def req():
    print (repr(os.environ))
        
cpfcgi.listen(req)

вот собственно сам модуль cpfcgi:
#include <Python.h>
#include <fcgi_stdio.h>
static PyObject * fcgi_listen(PyObject *self, PyObject *args)
{
        int num=0;
        PyObject * fun=NULL;
        if(!PyArg_ParseTuple(args, "O", &fun))
                return(NULL);
        Py_INCREF(fun);
        while(FCGI_Accept () >= 0)
        {
                printf("Content-type: text/html\r\n\r\nyo<br>%d",num);
                PyEval_CallObject(fun,NULL); // <- trouble is here
                num++;
        }
        Py_DECREF(fun);
        return Py_BuildValue("i", 0);
}
static PyMethodDef cpfcgiMethods[] = {
        {"listen",      fcgi_listen,    METH_VARARGS,   "listen for fastcgi requests."},
        {NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initcpfcgi(void)
{
        (void) Py_InitModule("cpfcgi", cpfcgiMethods);
}

здесь в каменте указано где проблема.
проблема собссно вот в чем: функция которую я передаю (req) не вызывается. тоесть строчка которая printf ("Content-type … срабатывает, а следующая нет, и дальше все срабатывает, num увеличивается, и все как положенно.
тоесть все работает кроме того что нада (собственно кроме вызова функции которую я передаю)
а мистика в том, что если запускать не через lighttpd а вручную - то функция вызывается, и пишет мне os.environ
(если запускать вручную то FCGI_Accept сразу срабатывает, не дожидаясь fastcgi запроса, и отдает все на stdout. на следующем проходе она не блокирует, и просто возвращает false)
код тотже, абсолютно ничего не меняю

может кто сталкивался с такими приколами?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version