Я хочу использовать Python для управления запатентованным спектроскопическим программным обеспечением (Princeton Instruments LightField). У меня есть пример автоматизации LightField с использованием Matlab. В примере используется .NET для управления LightField с использованием предоставленных DLL.Как использовать Python и .NET/C# для автоматизации Princeton Instruments LightField
Я использовал pythonnet для загрузки DLL в Python, но мне не удалось связаться с LightField.
Вот (не) рабочий пример:
import sys
sys.path.append(r"C:\Program Files\Princeton Instruments\LightField")
sys.path.append(r"C:\Program Files\Princeton Instruments\LightField\AddInViews")
import clr
clr.AddReference('PrincetonInstruments.LightFieldViewV4')
clr.AddReference('PrincetonInstruments.LightField.AutomationV4')
clr.AddReference('PrincetonInstruments.LightFieldAddInSupportServices')
import PrincetonInstruments.LightField.AddIns as AddIns
from PrincetonInstruments.LightField.Automation import Automation
instance = Automation(True,[])
А вот сообщение об ошибке:
File "D:/python/test_lightfield.py", line 21, in <module> instance = Automation(True,[])
TypeError: no constructor matches given arguments
Однако, когда я смотрю на начало помощи (автоматизации):
help(Automation)
Help on class Automation in module PrincetonInstruments.LightField.Automation:
class Automation(System.Object)
| Void .ctor(Boolean, System.Collections.Generic.List`1[System.String])
|
| Method resolution order:
| Automation
| System.Object
| builtins.object
|
| Methods defined here:
|
| __call__(self, /, *args, **kwargs)
| Call self as a function.
или соответствующий Matlab пример файла:
out.automation = PrincetonInstruments.LightField.Automation.Automation(visible,[]);
Похоже, что я создал экземпляр класса Automation с допустимыми аргументами (булевой и пустой строкой). У меня не так много документации, кроме моего файла образца Matlab.
Что я делаю неправильно?
EDIT: Это была проблема типа. Используя список типов .NET, вместо этого работает список Python.
from PrincetonInstruments.LightField.Automation import Automation
from System.Collections.Generic import List
from System import *
l = List[String]()
instance = Automation(True,l)
Вот выход автоматизация .__ overloads__ Out [4]: PrincetonInstruments.LightField.Automation.Automation (Boolean, System.Collections.Generic.List'1 [System.String]) – Darckense
Преобразования второго аргумента. NET (System.Collections.Generic.List [System.String]) перед его передачей. В pythonnet пока не поддерживается автоматическое преобразование контейнеров. – denfromufa
Жаль, что я был тяжелым, но как мне это сделать? Если я сначала импортирую систему, а затем экземпляр = Автоматизация (True, System.Collections.Generic.List [System.String]), это дает мне другое сообщение об ошибке. (ArgumentException: Impossible de convertir l'objet de type 'System.RuntimeType' en type 'System.Collections.Generic.List'1 [System.String]'.) (Извините за французский, он говорит, что не может преобразовать Type System.RunTime во второй тип Collections.Generic.List ...) – Darckense