2013-04-27 3 views
3

Я переписываю скрипт python для хранения данных из arduino в базе данных postgresql, желая запустить его как деамон, используя python-daemon. Оригинальный скрипт работает нормально, но в deamon я не могу писать в базу данных. Первая попытка заканчивается:python - потеря подключения к postgresql в daemon

<class 'psycopg2.DatabaseError'>, DatabaseError('SSL SYSCALL error: EOF detected\n' 

, а затем:

<class 'psycopg2.InterfaceError'>, InterfaceError('cursor already closed',) 

В рабочем сценарии, я:

connstring="dbname='"+dbdatabase+"' user='"+dbusername+"' host='"+dbhost+"'password='"+dbpassword+"'" 
try: 
    conn = psycopg2.connect(connstring) 
    cur=conn.cursor() 
except: 
    my_logger.critical(appname+": Unable to connect to the database") 
    sys.exit(2) 
sql="insert into measure (sensorid,typeid,value) VALUES(%s,%s,%s)" 
< more to set up serialport, logging and so on> 
while 1: 
    < fetch a data set and split it to a list > 
    for (i,val) in enumerate measures: 
    try: 
     cur.execute(sql,(sensors[i],typeid[i],val)) 
     conn.commit() 
    except: 
     self.logger.error(appname+": error 106 :"+str(sys.exc_info())) 

У меня есть чувство, что это может быть какой-то из того же проблема, которую я изначально имел с последовательным подключением, Serial port does not work in rewritten Python code, поэтому я попытался поиграть с files_preserve, делая:

self.files_preserve=range(daemon.daemon.get_maximum_file_descriptors()+1) 

который, насколько я могу судить, должен держать открытым все ручки файлов, но безрезультатно.

В демоне я попытался сначала настроить соединение с базой данных как атрибуты в __init__, i. е .:

self.conn = psycopg2.connect(connstring) 
self.cur=conn.cursor() 

, а затем делать вставки в методе run. Я также попытался создать соединение в верхней части метода run и даже настроить его как глобальный объект, но во всех случаях что-то, похоже, убивает соединение с базой данных. Любые подсказки? (или какие-либо подсказки, где найти какую-либо документацию (кроме источника) для модуля демонов?)

Оба демона и база данных работают на системах debian linux с python 2.7 and postgresql 8.4`.

+0

Благодарим вас за это! – m0meni

ответ

6

Насколько я могу судить по источнику, daemon.runner работает forking, а затем выполняет метод предлагаемого daemon приложения run.

Это означает, что вы создаете соединение с базой данных в одном процессе, но затем попытаться использовать его в раздвоенном процессе, который psycopg2 doesn't like:

libpq соединение не должно быть использовано раздвоенными процессами , поэтому [...] убедитесь, что вы создали соединения после вилки.

В этом случае это означает: переместить вызов psycopg2.connect в метод run.

+0

Два года спустя ты спас меня. Спасибо огромное! – m0meni

Смежные вопросы