在 Python3 中使用 C# DLL 和 Pythonnet
Using C# DLL in Python3 with Pythonnet
我在 Python3 中使用 c# dll,我使用的模块是 DaveSkender/Stock.Indicators
它是用 C# 编写的,符合公共语言规范 (CLS)。
所以我把它编译成dll
并在 Python3 中导入,如下所示:
import clr
clr.AddReference(r'dll/Skender.Stock.Indicators')
到此为止,可以正常运行,可以确定模块导入成功了。
但问题是传递参数。
C# DLL中有这样一个方法:
public static IEnumerable<SmaResult> GetSma<TQuote>(
IEnumerable<TQuote> history,
int lookbackPeriod)
where TQuote : IQuote
{
// WHATEVER
}
所以我像这样在 Python 中传递了参数:
from System.Collections.Generic import List
// Definitely, Qoute is inherited from IQoute
history_list = List[Qoute]()
Indicator.GetSma(history_list, int(1))
但是一直显示TypeError:
TypeError: No method matches given arguments for GetSma: (<class 'System.Collections.Generic.0, Culture=neutral, PublicKeyToken=null]]'>, <class 'int'>)
我不知道 Python 中的哪种类型与 C# 兼容。
我应该在这个方法中传递什么?
我的意思是我应该为 Python 中的 IEnumerable 传递什么?
感谢@Ralf,关于 GetSma()
,我再次查看了 C# 代码。它是通用方法,应该以通用形式调用。所以我试着像下面这样调用这个方法:
Indicator.GetSma[Qoute](history_list, int(1))
有效!!希望这个回答对有和我一样的人有帮助。
我在 Python3 中使用 c# dll,我使用的模块是 DaveSkender/Stock.Indicators 它是用 C# 编写的,符合公共语言规范 (CLS)。 所以我把它编译成dll 并在 Python3 中导入,如下所示:
import clr
clr.AddReference(r'dll/Skender.Stock.Indicators')
到此为止,可以正常运行,可以确定模块导入成功了。 但问题是传递参数。 C# DLL中有这样一个方法:
public static IEnumerable<SmaResult> GetSma<TQuote>(
IEnumerable<TQuote> history,
int lookbackPeriod)
where TQuote : IQuote
{
// WHATEVER
}
所以我像这样在 Python 中传递了参数:
from System.Collections.Generic import List
// Definitely, Qoute is inherited from IQoute
history_list = List[Qoute]()
Indicator.GetSma(history_list, int(1))
但是一直显示TypeError:
TypeError: No method matches given arguments for GetSma: (<class 'System.Collections.Generic.0, Culture=neutral, PublicKeyToken=null]]'>, <class 'int'>)
我不知道 Python 中的哪种类型与 C# 兼容。 我应该在这个方法中传递什么? 我的意思是我应该为 Python 中的 IEnumerable 传递什么?
感谢@Ralf,关于 GetSma()
,我再次查看了 C# 代码。它是通用方法,应该以通用形式调用。所以我试着像下面这样调用这个方法:
Indicator.GetSma[Qoute](history_list, int(1))
有效!!希望这个回答对有和我一样的人有帮助。