
调用fortran子程序获取数组长度后,需将ctypes类型(如c_int)显式转换为python原生int,才能用于列表乘法操作(如[0] * n),否则会触发typeerror。
在Python与Fortran混合编程中,常通过ctypes调用编译后的Fortran共享库(如.so或.dll)。Fortran子程序通常通过传引用方式返回整型结果(例如数组长度),此时Python端需使用ctypes.c_int配合ct.byref()传递地址。但c_int对象本身不是Python内置int,不能直接参与序列乘法运算(如[0] * n),因此会报错:
TypeError: can't multiply sequence by non-int of type 'c_long'
✅ 正确做法是:从c_int实例中提取其Python可识别的整数值。有两种等效且推荐的方式:
-
使用 .value 属性(最常用、最直观)
c_int 实例的 .value 属性直接返回对应的Python int 值:import ctypes as ct # 假设 fs 是已加载并正确配置的 Fortran 子程序 n = ct.c_int(0) fs(ct.byref(n)) # Fortran 将实际长度写入 n print('n (ctypes):', n) # 输出: c_long(123) print('n.value:', n.value) # 输出: 123 x = [0] * n.value # ✅ 成功创建长度为 n.value 的列表 print('x:', x) -
使用 int() 构造函数(语义清晰,兼容性好)
ctypes 类型支持 int() 转换,本质也调用 .value:立即学习“Python免费学习笔记(深入)”;
x = [0] * int(n) # ✅ 等价于 [0] * n.value
⚠️ 注意事项:
- ❌ 不要写 x = [0] * n(n 是 c_int 实例,非整数);
- ❌ 不要写 x = [0] * n.contents(返回指针对象,非数值);
- ✅ 若 Fortran 子程序可能修改多个输出参数,确保所有 c_int/c_double 等均通过 .value 提取结果;
- ? 调试时建议打印 type(n) 和 type(n.value),确认类型转换是否符合预期(前者为
,后者为 )。
总结:ctypes 与 Python 原生类型之间需显式桥接,.value 是访问 C 变量值的标准接口。掌握这一模式,即可安全、可靠地在 Python 中基于 Fortran 返回的尺寸动态构建列表、NumPy 数组或 ctypes 数组。










