为何使用Python.Runtime会出现“cannot unpack”错误,IronPython却正常?
解决Python.Runtime调用socket.create_connection时的拆包异常
问题原因
使用Python.Runtime调用socket.create_connection时,传入的C# ValueTuple<string, int>无法被Python识别为可迭代的元组类型,导致拆包操作失败,抛出'cannot unpack non-iterable ValueTuple[String,Int32] object'异常。而IronPython会自动完成.NET类型到Python类型的映射,因此不会出现该问题。
解决方案
需要将C#的元组显式转换为Python的元组对象,使用PyTuple.Create方法创建符合Python要求的元组后再传入函数。
修正后的代码
Runtime.PythonDLL = "python38.dll"; PythonEngine.Initialize(); dynamic socketModule = Py.Import("socket"); // 将C#元组转换为Python元组 var pythonAddrTuple = PyTuple.Create("127.0.0.1", 30001); dynamic clientSocket = socketModule.create_connection(pythonAddrTuple);
补充说明
Python.Runtime作为CPython与.NET的交互层,不会自动将所有.NET类型隐式转换为Python类型,对于元组、列表这类需要迭代的类型,必须显式调用对应的Python类型构造方法(如PyTuple.Create、PyList.Create)来完成类型转换,确保Python函数能正确处理参数。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

