파이썬 - python.net c# example




IronPython에서 C#으로 목록 전달 (2)

.NET 2.0 용 IronPython 2.6에서 C # 프로그램으로 문자열 목록을 전달하려고합니다. 2.0에서 작성된 DLL로 실행되는 API로 작업하기 때문에 .NET 2.0을 사용하고 있습니다. 그러나 ScriptEngine에서 돌아 오면서 어떻게 캐스팅해야할지 모르겠습니다.

namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            ScriptEngine engine = Python.CreateEngine();
            ScriptSource source = engine.CreateScriptSourceFromFile("C:\\File\\Path\\To\\my\\script.py");
            ScriptScope scope = engine.CreateScope();

            ObjectOperations op = engine.Operations;

            source.Execute(scope); // class object created
            object classObject = scope.GetVariable("MyClass"); // get the class object
            object instance = op.Invoke(classObject); // create the instance
            object method = op.GetMember(instance, "myMethod"); // get a method
            List<string> result = (List<string>)op.Invoke(method); // call the method and get result
            Console.WriteLine(result.ToString());
            Console.Read();
        }
    }
}

내 파이썬 코드는 문자열의 파이썬리스트를 반환하는 메소드를 가진 클래스를 가지고있다 :

class MyClass(object):
    def myMethod(self):
        return ['a','list','of','strings']

이 오류가 발생합니다.

Unable to cast object of type 'IronPython.Runtime.List' to type 'System.Collections.Generic.List`1[System.String]'.

C # 측에서 IList를 사용할 수 있으며 IronPython은 목록에 액세스 할 때 string과의 변환을 수행하는 래퍼에 List 객체를 자동으로 래핑합니다.


IronPython.Runtime.List 는 다음 인터페이스를 구현합니다.

IList, ICollection, IList<object>, ICollection<object>, IEnumerable<object>, IEnumerable

그래서이 유형들 중 하나에 캐스트 한 다음 List<string> 으로 변환 할 수 있습니다.

List<string> result = ((IList<object>)op.Invoke(method)).Cast<string>().ToList();

BTW, 아마 당신은 그것을 알고 있지만 IronPython에서 .NET 유형을 사용할 수도 있습니다. 예 :

from System.Collections.Generic import *

class MyClass(object):
    def myMethod(self):
        return List[str](['a','list','of','strings'])

여기서 myMethodList<string>

편집하다:

당신이 두 가지 옵션 (IMO)이 있습니다. NET 2.0 (그래서 LINQ 없음) 사용하고 감안할 때 :

1. IList<object> 캐스팅하고 사용하십시오.

IList<object> result = (IList<object>)op.Invoke(method);

PRO : 루프가 필요하지 않으면 파이썬 스크립트에서 반환 한 것과 동일한 객체 인스턴스를 사용하게됩니다.
단점 : 형식 안전성이 없습니다 (파이썬에서와 같을 것입니다. 따라서 목록에 비 문자열도 추가 할 수 있습니다)

2. List<string> 변환 List<string> / IList<string> :

IList<object> originalResult = (IList<object>)op.Invoke(method);
List<string> typeSafeResult = new List<string>();
foreach(object element in originalResult)
{
    typeSafeResult.Add((string)element);
}

PRO : 안전 목록을 입력하십시오 (문자열 만 추가 할 수 있음).
단점 : 루프가 필요하며 변환 된 목록은 새 인스턴스입니다 (스크립트에서 반환 된 것과 동일하지 않음)





ironpython