【问题标题】:How to use win32com Dispatch in django/python?如何在 django/python 中使用 win32com Dispatch?
【发布时间】:2016-06-01 01:30:30
【问题描述】:

我正在尝试将我的 django 应用程序与 PIOLEDB 连接,但 Despatch 在下面抛出异常是我的代码,请指导我做错了什么。我是 PI Systems 的新手

oConn = Dispatch('ADODB.Connection')
oRS = Dispatch('ADODB.RecordSet')

#oConn.ConnectionString = "Provider=PIOLEDB;Data Source=localhost;User ID=piadmin;database=sparktest"
oConn.ConnectionString = "Provider=PIOLEDB; Data Source=pi-spark; Integrated Security=True"
if oConn.State == 0:
    print "We've connected to the database."
    # db_cmd = """SELECT time,tag,value FROM piarchive..picomp2 where tag like 'BOP:692-RTU-9001W'"""
    db_cmd = """SELECT * FROM piarchive..picomp2 WHERE tag = 'SEC.CT06.SG.CT6-GEN-CE-SEI-Y.V.none.1X.Ycoord' and time > '11/1/2014 2:42 PM' and time < '11/1/2014 3:47 PM'"""
    #db_cmd = """SELECT * FROM piarchive..picomp2 WHERE tag = 'SEC.CT06.SG.CT6-TRB-EX-SEI-5.V.none.2xMagnitude'"""
    # db_cmd = """SELECT * FROM pipoint"""1
    oRS.ActiveConnection = "Provider=PIOLEDB; Data Source=localhost; Integrated Security=True"
    oRS.Open(db_cmd)
    while not oRS.EOF:
        #print oRS.Fields.Item("tag").Value   # Ability to print by a field name
        row=""
        for i in range(0,oRS.Fields.Count):
            row+="      "+str(oRS.Fields.Item(i).Value)
        # print oRS.Fields.Item(0).Value        # Ability to print by a field location
        print row
        oRS.MoveNext()
    oRS.Close()
    oRS = None
else:
    print "Not connected"

#if oConn.State == 0:
   # oConn.Close()
oConn = None

这是我的堆栈跟踪,请帮我解决这个问题。

com_error at /main/
(-2147221008, 'CoInitialize has not been called.', None, None)
Request Method: GET
Request URL:    http://localhost:8000/main/
Django Version: 1.9.2
Exception Type: com_error
Exception Value:    
(-2147221008, 'CoInitialize has not been called.', None, None)
Exception Location: C:\Python27\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatch, line 91
Python Executable:  C:\Python27\python.exe
Python Version: 2.7.0
Python Path:    
['C:\\Users\\abubakr\\Desktop\\osioledb',
 'C:\\Windows\\SYSTEM32\\python27.zip',
 'C:\\Python27\\DLLs',
 'C:\\Python27\\lib',
 'C:\\Python27\\lib\\plat-win',
 'C:\\Python27\\lib\\lib-tk',
 'C:\\Python27',
 'C:\\Python27\\lib\\site-packages',
 'C:\\Python27\\lib\\site-packages\\win32',
 'C:\\Python27\\lib\\site-packages\\win32\\lib',
 'C:\\Python27\\lib\\site-packages\\Pythonwin']
Server time:    Fri, 19 Feb 2016 12:53:05 +0000

【问题讨论】:

  • 看来您需要致电CoInitialize
  • 如果我将它放在 python 文件中并从终端执行,则此代码工作正常

标签: python django win32com


【解决方案1】:

@Sayse 的答案是正确的,但他们没有告诉你如何;-)。我们开始:

添加

import pythoncom
pythoncom.CoInitialize()

在您的Dispatch 代码前面。请参阅'CoInitialize has not been called' When call a function with parameters by Objectwin32com.client.Dispatch + Cherrypy = CoInitialize has not been called 了解更多详情。

例如,我使用 Outlook 从 Django 发送(或保存)电子邮件的代码如下所示:

def send_mail_via_outlook(address, mailtext):
    import pythoncom
    pythoncom.CoInitialize() #@UndefinedVariable
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = address
    mail.Subject = "My Subject"
    mail.body = mailtext
    #    mail.send #send e-mail immediately
    mail.save() #save e-mail in draft folder.    

【讨论】:

  • 它困扰了我很长时间,你的答案对我有用!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多