Python, comtypes and ArcObjects: Error creating AppROT object
我在python 2.6.5和arcgis 10 sp1下试验
下面是我运行的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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 \ MyClass is the class to be instantiated, \ 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!" |
下面是脚本的输出:
1 2 3 4 5 6 7 8 9 10 11 12 | Traceback (most recent call last): File"C:\temp\ComHelpers.py", line 35, in NewObj ptr = CreateObject(MyClass, interface=MyInterface) File"C:\Python26\ArcGIS10.0\lib\site-packages\comtypes\client\__init__.py", line 235, in CreateObject obj = comtypes.CoCreateInstance(clsid, clsctx=clsctx, interface=interface) File"C:\Python26\ArcGIS10.0\lib\site-packages\comtypes\__init__.py", line 1145, in CoCreateInstance _ole32.CoCreateInstance(byref(clsid), punkouter, clsctx, byref(iid), byref(p)) File"_ctypes/callproc.c", line 925, in GetResult WindowsError: [Error -2147221231] ClassFactory cannot supply requested class No AppROT found No ArcGIS application found! |
感谢您的洞察力!
为了完整起见,Jason Scheirer在GIS堆栈交换上发布了此解决方案:
Import arcpy first, you aren't doing any license checkout or setting up the ArcObjects 10.0 runtime as-is so it won't find the CoClass.