我正在Python 2.6.5和ArcGIS 10 SP1下尝试使用comtypes
和ArcObjects。我使用纯Python方法包装this answer中描述的ArcObjects OLB,但是在comtypes.CoCreateInstance
方法中出现错误。
这是我正在运行的代码:
def WrapModules():
#force wrapping of all ArcObjects libraries (OLBs)
import os
import comtypes.client
# change com_dir to whatever it is for you
com_dir = r'C:\Program Files\ArcGIS\Desktop10.0\com'
coms = [os.path.join(com_dir, x) for x in os.listdir(com_dir) if os.path.splitext(x)[1].upper() == '.OLB']
map(comtypes.client.GetModule, coms)
def GetApp():
"""Get a hook into the current session of ArcMap"""
from comtypes.gen import esriFramework
pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
if pAppROT is not None:
iCount = pAppROT.Count
if iCount == 0:
print 'No ArcGIS application currently running. Terminating ...'
return None
for i in range(iCount):
pApp = pAppROT.Item(i) #returns IApplication on AppRef
if pApp.Name == 'ArcMap':
print "ArcMap found"
return pApp
print 'No ArcMap session is running at this time.'
print "No AppROT found"
return None
def NewObj(MyClass, MyInterface):
"""Creates a new comtypes POINTER object where\n\
MyClass is the class to be instantiated,\n\
MyInterface is the interface to be assigned"""
from comtypes.client import CreateObject
import traceback
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
print traceback.format_exc()
return None
if __name__ == "__main__":
WrapModules()
pApp = GetApp()
if pApp is not None:
print "HWND: %d" % pApp.hWnd
else:
print "No ArcGIS application found!"
这是脚本的输出:
追溯(最近一次通话):
在NewObj中,文件“ C:\ temp \ ComHelpers.py”,第35行
ptr = CreateObject(MyClass,interface = MyInterface)
CreateObject中的文件“ C:\ Python26 \ ArcGIS10.0 \ lib \ site-packages \ comtypes \ client \ __ init__.py”,第235行
obj = comtypes.CoCreateInstance(clsid,clsctx = clsctx,interface = interface)
CoCreateInstance中的文件“ C:\ Python26 \ ArcGIS10.0 \ lib \ site-packages \ comtypes \ __ init__.py”,行1145
_ole32.CoCreateInstance(byref(clsid),punkouter,clsctx,byref(iid),byref(p))
GetResult中的文件“ _ctypes / callproc.c”,第925行
WindowsError:[错误-2147221231] ClassFactory无法提供请求的类
找不到AppROT
找不到ArcGIS应用程序!
感谢您提供的任何见解!
最佳答案
为了完整起见,this solution由Jason Scheirer在GIS Stack Exchange上发布:
首先导入arcpy,您无需进行任何许可证签出或按原样设置ArcObjects 10.0运行时,因此找不到CoClass。