【发布时间】:2014-02-04 11:26:04
【问题描述】:
所以我设法在 Python .NET 中导入了一个托管的 .NET 程序集,并设置了几个对象并调用了一些函数,但我不知道这个程序应该如何工作。
这是我要移植的 C# 代码:
// read event sticky clears all initial events
CML_EVENT_STATUS status=0;
xAxisAmp.ReadEventSticky(ref status);
statusTextBox.Text = Convert.ToString(status);
我可以导入CML_EVENT_STATUS,它报告它是<class 'CMLCOMLib.CML_EVENT_STATUS'>,但是当我尝试创建它的实例时,我得到了这个错误:
>>> stat = CML_EVENT_STATUS()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot instantiate enumeration
如果还有其他方法可以调用该函数,我无法弄清楚。我试过调用xAxisAmp.ReadEventSticky() 和xAxisAmp.ReadEventSticky(0),它们只返回TypeError: No method matches given arguments。
我得到的最接近的是来自xAxisAmp.ReadEventSticky(CML_EVENT_STATUS)的这个错误:
System.ArgumentException: Object of type 'System.RuntimeType' cannot be converted to type 'CMLCOMLib.CML_EVENT_STATUS&'.
我做错了什么?我找不到任何关于声明枚举类型或通过引用传递它们的文档,这让我发疯。
【问题讨论】:
-
Python 在 3.4 中添加了一个
Enum类:docs.python.org/3.4/library/enum.html 你的枚举是基于这个吗?如果是这样,status = CML_EVENT_STATUS(0)应该等同于您的第一行。 -
或者例如如果
0的名字是SOME_EVENT,我希望你可以简单地写CML_EVENT_STATUS.SOME_EVENT来获得那个值。 -
这是在 Python 2.7 中的,我也尝试过。同样的
cannot instantiate enumeration错误。您可以像您说的那样访问枚举名称,但我仍然无法调用该函数。 -
我无法重现此问题。请参阅 pastebin.com/c3eAca14 的 C# 代码和 pastebin.com/z1SEWbvT 的 Python 控制台日志,因此
CML_EVENT_STATUS.SOME_EVENT(使用正确的名称)应该适合您。注意ref参数是如何处理的,作为this question 中的返回值(Python for .NET 与 IronPython 在这里的工作方式相同) -
酷,我会把它变成答案。
标签: c# python python.net