我正在尝试使用 comtypes 模块访问ArcGIS10.1附带的.olb文件。一些.olb文件工作(esriGeometry.olb),其中一些不工作(esriSystem.olb),其中一些文件在某些时候工作(esriSearch.olb)。
以下代码
from comtypes.client import GetModule
olb_path = 'C:\\Program Files (x86)\\ArcGIS\\Desktop10.1\\com\\esriSystem.olb'
m = GetModule(path)
引发此追溯和异常
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
test3()
File "D:\Data\MatthewPlourde\JAMES\gis_tools\tool.py", line 139, in test3
m = GetModule(path)
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\client\_generate.py", line 112, in GetModule
mod = _CreateWrapper(tlib, pathname)
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\client\_generate.py", line 188, in _CreateWrapper
mod = _my_import(fullname)
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\client\_generate.py", line 26, in _my_import
return __import__(fullname, globals(), locals(), ['DUMMY'])
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\gen\_5E1F7BC3_67C5_4AEE_8EC6_C4B73AAC42ED_0_10_1.py", line 5705, in <module>
( ['in'], POINTER(_midlSAFEARRAY(POINTER(BSTR))), 'pParameters' ),
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\safearray.py", line 18, in _midlSAFEARRAY
sa_type = _make_safearray_type(itemtype)
File "C:\Python27\ArcGIS10.1\lib\site-packages\comtypes\safearray.py", line 53, in _make_safearray_type
raise TypeError(itemtype)
TypeError: <class 'comtypes.errorinfo.LP_BSTR'>
显然comtypes.safearray._make_safearray_type
不知道如何处理<class 'comtypes.errorinfo.LP_BSTR'>
。如果有人在那里使用ArcGIS10.1,我很高兴知道你是否可以重现这个错误,特别感谢你知道原因。
答案 0 :(得分:4)
我在ArcGIS论坛上找到了解决方案posted。它只涉及修改 comtypes 源中的automation.py
。将条目POINTER(BSTR): VT_BYREF|VT_BSTR
添加到_ctype_to_vartype
字典。
在此之后,所有.olb的负载。
答案 1 :(得分:0)
我也是,我有这个确切的错误,我无法超越它。如果您发现会发生什么,请更新此信息。我唯一能找到的东西就是说可能会混合32位和64位库。 (另外,我没有看到我在哪里可以回复你的问题......只有一个答案。我不太使用stackexchange)
让我添加一些可能对您有帮助的内容,这取自:http://forums.arcgis.com/threads/15848-ArcMap-10-ArcObjects-and-Python-very-cool-but-help-with-a-couple-of-problems
import logging
# grab rootlogger
_loggy = logging.getLogger()
_loggy.setLevel(logging.DEBUG)
_loggy.addHandler(logging.FileHandler("derpdebug.log"))
import os
import comtypes.client
# change com_dir to whatever it is for you
com_dir = r'C:\Program Files (x86)\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)
# check add whatever you want here.
import comtypes.gen.esriArcMapUI
import comtypes.gen.esriGeodatabase
print dir(comtypes.gen.esriArcMapUI)
然后我就做了: grep -v ^发布derpdebug.log&gt; readable.log