Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 27, 2015 12:22:14

kristus
Зарегистрирован: 2012-10-27
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение из *.mdb через сетевой диск как служба!

Не получается произвести чтение из 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)
Код службы правильный делал по примеру + пытался подставлять вместо DSN(*.mdb) чтение из MYsql служба работает.Ума не приложу почему не видит через сетвой диск *.mdb(((

служба выдвет ошибку: Error(IM002',IM002)
Система 64 server 2012 ?python32, источники создавал и в 64 и в 32 - результат один.
Думаю как-то связано с сетевым диском
Может кто знает помогите! Спасибо

Офлайн

#2 Авг. 27, 2015 22:29:50

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Чтение из *.mdb через сетевой диск как служба!

Все правильно - для сеанса (а также пользователя) в котором работает эта служба - сетевой диск не подключен.

Офлайн

#3 Авг. 28, 2015 08:38:18

kristus
Зарегистрирован: 2012-10-27
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение из *.mdb через сетевой диск как служба!

Все правильно - для сеанса (а также пользователя) в котором работает эта служба - сетевой диск не подключен.
Спасибо,я понял!

Отредактировано kristus (Сен. 2, 2015 08:47:43)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version