#python #com
Вопрос:
библиотека tlb в моем проекте на python win32com.client
. Я легко работал со многими встроенными функциями, но одна из основных функций получает список параметров, два из которых помечены как ref int
. Когда я пытаюсь передать целое число python в функцию, я получаю pywintypes.com_error: (-2147352571, 'Type mismatch.', None, 5)
ошибку, которая, очевидно, связана с некоторыми неверными параметрами, переданными объекту.
Это мой код python:
import sldworksPython as solidWorks
import sldconstPython as solidConst
import win32com.client
swApp: solidWorks.ISldWorks = win32com.client.Dispatch(solidWorks.SldWorks.CLSID)
swConst = solidConst.constants
fileName = "Assem Of Hinge.SLDASM"
docType = int(swConst.swDocASSEMBLY)
config = int(swConst.swOpenDocOptions_AutoMissingConfig)
error = int(swConst.swFileNotFoundError)
warning = int(swConst.swFileLoadWarning_AlreadyOpen)
print(type(error))
swApp.OpenDoc6(
fileName,
docType,
config,
error,
warning
)
а вот функция openDoc6:
ModelDoc2 OpenDoc6(string FileName, int Type, int Options, string Configuration, ref int Errors, ref int Warnings);
эта ошибка выводит меня из себя, я действительно не хочу использовать C# для этого проекта. Спасибо за вашу помощь
Комментарии:
1. Очевидно, что ему не нравятся целые числа Python, которые сильно отличаются от целых чисел C. Я думаю, что вам не следует преобразовывать все эти
swConst
значения в целые числа Python.2. @BoarGules Я пытался не конвертировать их, но все равно та же проблема.
3. Я ничего не могу найти на
sldworksPython
нем . Возможно ли, что модуль был написан для Python 2, в котором были целые числа в стиле C? Если в последний раз он обновлялся более 5 лет назад, это вполне вероятно. Если это так, вы можете попробовать pypi.org/project/pySW , что для Python >= 3.6.
Ответ №1:
Благодаря @BoarGules я только что скачал библиотеку для SW с именем pySW. Мне было интересно, как там работают функции, поэтому я только что проверил их и понял, как передать целое число в качестве ссылки на функции C#.
Я добавляю свое решение ниже:
import sldconstPython as solidConst
import win32com.client
import pythoncom
import pySW
swApp: solidWorks.ISldWorks = win32com.client.Dispatch(solidWorks.SldWorks.CLSID)
swConst = solidConst.constants
fileName = "Assem Of Hinge.SLDASM"
docType = swConst.swDocASSEMBLY
docOpts = swConst.swOpenDocOptions_AutoMissingConfig
error = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, swConst.swFileNotFoundError)
warning = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, swConst.swFileLoadWarning_AlreadyOpen)
swApp.OpenDoc6(fileName, docType, docOpts, "", error, warning)
Это было странно, так как VSCode не предлагал мне никаких pythoncom
констант. В любом случае, надеюсь, это поможет людям, которые сталкиваются с такой проблемой.
Комментарии:
1. Подсказки VSCode обычно не работают
pythoncom
, причина в том, чтоpythoncom
объекты являются тонкими оболочками Python вокруг объектов VBA.pythoncom
Объекты ничего не знают об объектах VBA, кроме их точек входа, и VSCode не может видеть сквозь оболочки.2. Да, теперь я понял проблему. Спасибо за вашу помощь @BoarGules . Я бы не смог решить свою проблему без вашей помощи.