2016-11-03 1 views
3

Я хочу использовать 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) 

ответ

2

Проверка поддерживаемых сигнатур конструктора в __overloads__, например .:

>>> import clr 
>>> from System import Decimal 
>>> Decimal.__overloads__ 
System.Decimal(Int32[]) 
System.Decimal(UInt64) 
System.Decimal(UInt32) 
System.Decimal(Int64) 
System.Decimal(Int32) 
System.Decimal(Single) 
System.Decimal(Double) 
System.Decimal(Int32, Int32, Int32, Boolean, Byte) 

EDIT:

Преобразование второй аргумент типа .NET (System.Collections.Generic.List[System.String]) перед передачей его. В pythonnet пока не поддерживается автоматическое преобразование контейнеров.

EDIT:

Вот как это сделать:

В C#:

using System; 
using System.Collections.Generic; 

namespace ListInConstr 
{ 
    public class ListInConstr 
    { 
     public ListInConstr(bool test1, List<String> test2) 
     { 

     } 
    } 
} 

Компиляция это в DLL:

csc.exe /target:library ListInConstr.cs

В Python:

>>> import clr 
>>> import sys 
>>> sys.path.append(r"C:\Debug") 
>>> clr.AddReference("ListInConstr") 
<System.Reflection.RuntimeAssembly object at 0x02849E50> 
>>> from ListInConstr import ListInConstr 
>>> ListInConstr.__overloads__ 
ListInConstr.ListInContr(Boolean, System.Collections.Generic.List`1[System.String]) 
>>> from System.Collections.Generic import List 
>>> from System import String 
>>> arg2=List[String]() #do not add elements here 
>>> ListInConstr(True,arg2) 
<ListInConstr.ListInConstr object at 0x0284E890> 
>>> 
+0

Вот выход автоматизация .__ overloads__ Out [4]: ​​PrincetonInstruments.LightField.Automation.Automation (Boolean, System.Collections.Generic.List'1 [System.String]) – Darckense

+0

Преобразования второго аргумента. NET (System.Collections.Generic.List [System.String]) перед его передачей. В pythonnet пока не поддерживается автоматическое преобразование контейнеров. – denfromufa

+0

Жаль, что я был тяжелым, но как мне это сделать? Если я сначала импортирую систему, а затем экземпляр = Автоматизация (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

Смежные вопросы