Python передает ref int в качестве параметра

#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 . Я бы не смог решить свою проблему без вашей помощи.