Использование библиотеки DLL C# в Python3 с Pythonnet

#python #c# #clr #python.net

Вопрос:

Я использую библиотеку dll c# в Python3, и модуль, который я использую, — это DaveSkender/Stock.Индикаторы Он написан на 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: No method matches given arguments for GetSma: (<class 'System.Collections.Generic.0, Culture=neutral, PublicKeyToken=null]]'>, <class 'int'>)
 

Я не знаю, какой тип в Python совместим с C#.
Что я должен передать в этом методе?
Я имею в виду, что я должен выдавать за IEnumerable в Python?

Комментарии:

1. Может быть, другой параметр? Как определяется int в python?

2. И кстати, вы показываете метод GetSmaExtended, но вы используете (или пытаетесь использовать) метод GetSma.

3. @Ralf О, спасибо, что проявили интерес к этому. Я исправил это, но ничего не изменилось. 🙂

Ответ №1:

Спасибо @Ralf, я снова заглянул в код на C# GetSma() . И это универсальный метод, его следует вызывать в универсальной форме. Поэтому я попытался вызвать этот метод, как показано ниже:

 Indicator.GetSma[Qoute](history_list, int(1))
 

Это работает!! Надеюсь, этот ответ будет полезен, если есть кто-то вроде меня.