【pythonnet詳解】—— Python 和 .NET 互操作的庫_pythonnet 詳細使用-CSDN博客?
Python中動態調用C#的dll動態鏈接庫中方法_python 如何調用c# dll-CSDN博客
需求:Python調用并傳List<float>類型參數給.Net?
?起初:直接? # 創建一個Python浮點數列表?py_float_list = [0.23, 0.34, 0.45],但是報錯
def callCS(model_url, methodName, argsType, argsVal, returnType, addition):# 找到c#程序集clr.FindAssembly(model_url)# 解析參數獲取命名空間、類名和判斷是否為靜態方法的標識namespace, className, static = parseAddition(addition)# 解析參數argsParsedArr = parsePyArgs(argsVal, argsType)print(argsParsedArr)# 創建一個Python浮點數列表py_float_list = [0.23, 0.34, 0.45]listValue= py_float_list# 設置模塊【命名空間】dll = clr.AddReference(namespace)## #從指定命名空間導入類# # from ClassLibrary1 import TestCsharp#動態導入模塊module_1 = importlib.import_module(namespace)#獲取命名下的指定類class_1 = getattr(module_1, className)#判斷是否為靜態方法if static == '1':method2 = getattr(class_1, methodName)# 調用靜態方法并打印print(method2(argsParsedArr[0],listValue))else:# 實例化my_instance = class_1()# 獲取非靜態方法method1 = getattr(my_instance, methodName)# 調用非靜態方法并打印print(method1(*argsParsedArr))
Python.Runtime.PythonException: 'list' value cannot be converted to System.Collections. Generic.List`1[System.Single],大概可以理解為python中list無法轉化為.Net中List<T>[T為泛型]
然后,根據網上博客和AI工具推薦:
在Python中,你需要導入C# DLL,并使用pythonnet
提供的機制來調用C#方法。但是,由于pythonnet
不直接支持C#的泛型列表,你需要將Python列表轉換為C#可以理解的數組或其他集合類型。
import clr
# 加載C# DLL,假設DLL名為MyCSharpLibrary.dll,并且位于當前工作目錄
clr.AddReference('MyCSharpLibrary')
from MyCSharpLibrary import MyCSharpClass # 創建一個Python浮點數列表
py_float_list = [1.23, 2.34, 3.45] # 將Python列表轉換為C#可以理解的數組(這里我們使用float數組)
float_array = (clr.Convert(item, System.Single) for item in py_float_list)
float_list = System.Array[System.Single](list(float_array)) # 調用C#方法,傳遞float數組(或轉換為List<float>,如果需要)
MyCSharpClass.ProcessFloatList(float_list) # 注意:如果C#方法期望List<float>而不是數組,你可能需要創建一個List并填充它
# float_list_csharp = System.Collections.Generic.List[System.Single]()
# for item in py_float_list:
# float_list_csharp.Add(clr.Convert(item, System.Single))
# MyCSharpClass.ProcessFloatList(float_list_csharp)---------------------------------------------------------------------------import clr # 加載C# DLL
clr.AddReference('MyCSharpLibrary')
import MyCSharpLibrary # 創建一個Python浮點數列表
py_float_list = [1.23, 2.34, 3.45] # 將Python列表轉換為C# float數組
float_array = System.Array[System.Single](py_float_list) # 注意這里直接使用py_float_list可能不起作用
# 正確的做法是使用列表推導式或循環來轉換每個元素
float_array = (System.Single(x) for x in py_float_list)
float_array = System.Array[System.Single](list(float_array)) # 將生成器轉換為列表,再轉換為數組 # 調用C#方法,傳遞float數組
MyCSharpLibrary.MyCSharpClass.ProcessFloatArray(float_array)
此時報錯,無法導入System模塊(.Net系統工作空間)?,然后在網上看到博客(試了無效):
看來官方文檔,的確試可以導入System命名空間,是不是python、pythonnet、.net版本不匹配或者環境變量設置不正確(待查借助官方文檔!!)?
pythonnet官方文檔 :https://pythonnet.github.io/pythonnet/python.html