C#调用Python方法并获取返回对象

1.python文件

def get_order():
    return {
        "total": 2,
        "items": [
            {
                "id": 1,
                "name": "apple",
                "price": 3.5
            },
            {
                "id": 2,
                "name": "banana",
                "price": 2.0
            }
        ]
    }

2.返回对象模型

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}
public class OrderResult
{
    public int Total { get; set; }
    public List<Item> Items { get; set; }
}

3.手写Mapper

public class ItemMapper : IPyMapper<Item>
{
    public Item Map(PyObject obj)
    {
        using var dict = new PyDict(obj);

        return new Item
        {
            Id = PySafe.Int(dict, "id"),
            Name = PySafe.String(dict, "name"),
            Price = PySafe.Double(dict, "price")
        };
    }
}
public class OrderMapper : IPyMapper<OrderResult>
{
    private static readonly ItemMapper _itemMapper = new();

    public OrderResult Map(PyObject obj)
    {
        using var dict = new PyDict(obj);

        return new OrderResult
        {
            Total = PySafe.Int(dict, "total"),
            Items = PySafe.List(dict, "items", _itemMapper)
        };
    }
}

4.Program调用

static void Main(string[] args)
{
    Runtime.PythonDLL = @"C:\Users\A\AppData\Local\Programs\Python\Python311\python311.dll";
    PythonEngine.Initialize();
    using (Py.GIL())
    {
        string scriptDir = Path.Combine(
            AppContext.BaseDirectory,
            "Scripts"
        );
        dynamic sys = Py.Import("sys");
        sys.path.append(scriptDir);
        dynamic order = Py.Import("order"); 
        PyObject pyResult = order.get_order();
        var mapper = new OrderMapper();
        OrderResult result = mapper.Map(pyResult);
        Console.WriteLine($"total:{result.Total}");
    }
}
posted @ 2026-01-27 02:45  十一点起床  阅读(2)  评论(0)    收藏  举报