Python将ref int作为参数传递

Posted

技术标签:

【中文标题】Python将ref int作为参数传递【英文标题】:Python pass ref int as parameter 【发布时间】:2021-12-14 17:52:11 【问题描述】:

我的python项目中的tlb库通过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#。感谢您的帮助

【问题讨论】:

显然它不喜欢 Python 整数,这与 C 整数有很大不同。我认为您不应该将所有这些 swConst 值转换为 Python 整数。 @BoarGules 我试过不转换它们,但仍然是同样的问题。 我在sldworksPython 上找不到任何内容。该模块是否有可能是为具有 C 风格整数的 Python 2 编写的?如果它最后一次更新是在 5 年多以前,那很有可能。如果是这样,您可以尝试pypi.org/project/pySW,它适用于 Python >= 3.6。 【参考方案1】:

感谢@BoarGules,我刚刚下载了一个名为 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 常量。无论如何,希望这对面临此类问题的人有所帮助。

【讨论】:

VSCode 的提示通常不适用于 pythoncom,原因是 pythoncom 对象是 VBA 对象周围的薄 Python 包装器。 pythoncom 对象除了入口点之外对 VBA 对象一无所知,并且 VSCode 无法看穿包装器。 是的,我现在明白了这个问题。感谢您的帮助@BoarGules。没有您的帮助,我将无法解决我的问题。

以上是关于Python将ref int作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将属性作为“out”或“ref”参数传递?

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗

将DataContext对象作为'ref'参数传递的缺点吗?

ref和out实际用法

函数不将右值引用作为参数? [复制]

如何将2D数组作为参数从C#传递给python