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}");
}
}

浙公网安备 33010602011771号