Форум сайта python.su
Не получается произвести чтение из mdb файла по сети через сетевой диск, в случае упаковки через py2exe в службу. Если делать процессом, то все работает. Пробовал создавать DSN, подключал pyodbc и odbc пакеты!
Пример кода после упаковки через py2exe Setup.py:
from distutils.core import setup import py2exe py2exe_options = {"includes": ['decimal'],'bundle_files': 1} setup( options = {'py2exe':{'bundle_files': 1}}, windows = [{'script': "solid_test.py"}], zipfile = None, )
cnxn = pyodbc.connect("DSN=solid") cursor = cnxn.cursor() cursor.rollback() cursor.execute('select DatTime, Q, Ro, Sol from Solid order by Dattime') rows = cursor.fetchall() cursor.rollback() cursor.close() cnxn.close()
from distutils.core import setup import py2exe py2exe_options = {"includes": ['decimal'],'bundle_files': 1} setup( service=[{'modules':'solid_test.py','cmdline_style':'pywin32','description':'your service description'}], options={'py2exe':py2exe_options}, zipfile=None)
# -*- coding: utf-8 -*- #! /usr/bin/env python import win32serviceutil import win32service import win32event import servicemanager import pyodbc import mysql.connector import time import odbc class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "Solid_DB" _svc_display_name_ = "Solid_DB" _svc_description_ = "__Import data from \\c-dispatcher-sh\view\solid74..78 to my sql asdk id(74001-78003)" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) self.hWaitResume = win32event.CreateEvent(None, 0, 0, None) self.timeout = 400 #Пауза между выполнением основного цикла службы в миллисекундах self.resumeTimeout = 400 self._paused = False def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STOPPED, (self._svc_name_, '')) def SvcPause(self): self.ReportServiceStatus(win32service.SERVICE_PAUSE_PENDING) self._paused = True self.ReportServiceStatus(win32service.SERVICE_PAUSED) servicemanager.LogInfoMsg("The %s service has paused." % (self._svc_name_, )) def SvcContinue(self): self.ReportServiceStatus(win32service.SERVICE_CONTINUE_PENDING) win32event.SetEvent(self.hWaitResume) self.ReportServiceStatus(win32service.SERVICE_RUNNING) servicemanager.LogInfoMsg("The %s service has resumed." % (self._svc_name_, )) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'')) self.main() def timestamp(data): data=time.mktime(data.timetuple()) return data def read_solid_74(self): # <------------------------------- таже функция только в службе не работает! Не найден источник данных MDB = 'z:\Solid074.mdb' DRV = '{Microsoft Access Driver (*.mdb, *.accdb)}' #PWD = 'mypassword' #conn = pyodbc.connect('DRIVER=%s;DBQ=%s' % (DRV,MDB)) #curs = conn.cursor() cnxn = pyodbc.connect('DRIVER=%s;DBQ=%s' % (DRV,MDB), autocommit=True) #cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DSN=solid_74;UID=GRD\nekrasov-ee;PWD=qwerty-12') cursor = cnxn.cursor() #cursor.rollback() cursor.execute('select DatTime, Q, Ro, Sol from Solid order by Dattime') rows = cursor.fetchall() cursor.rollback() cursor.close() cnxn.close() return rows def read_solid_78(self): cnxn = pyodbc.connect("DSN=solid_78") cursor = cnxn.cursor() cursor.rollback() cursor.execute('select DatTime, Q, Ro, Sol from Solid order by Dattime') rows = cursor.fetchall() cursor.rollback() cursor.close() cnxn.close() return rows #В этом методе реализовываем нашу службу def main(self): #Здесь выполняем необходимые действия при старте службы servicemanager.LogInfoMsg("Hello! I'm a Dummy Service.") while True: self.read_solid_74() #<---------------------------Вот здесь ошибка, но не раб сам источник данных servicemanager.LogInfoMsg("I'm still here.") #Проверяем не поступила ли команда завершения работы службы rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout) if rc == win32event.WAIT_OBJECT_0: #Здесь выполняем необходимые действия при остановке службы servicemanager.LogInfoMsg("Bye!") break #Здесь выполняем необходимые действия при приостановке службы if self._paused: servicemanager.LogInfoMsg("I'm paused... Keep waiting...") #Приостановка работы службы while self._paused: #Проверям не поступила ли команда возобновления работы службы rc = win32event.WaitForSingleObject(self.hWaitResume, self.resumeTimeout) if rc == win32event.WAIT_OBJECT_0: self._paused = False #Здесь выполняем необходимые действия при возобновлении работы службы servicemanager.LogInfoMsg("Yeah! Let's continue!") break if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppServerSvc)
Офлайн
Все правильно - для сеанса (а также пользователя) в котором работает эта служба - сетевой диск не подключен.
Офлайн
Все правильно - для сеанса (а также пользователя) в котором работает эта служба - сетевой диск не подключен.Спасибо,я понял!
Отредактировано kristus (Сен. 2, 2015 08:47:43)
Офлайн