You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用glShaderSource()时出现'int' object is not iterable错误

PyOpenGL中glShaderSource触发TypeError的解决方法

问题场景

在Python 3.9环境下使用PyOpenGL 3.3编写着色器代码时,调用glShaderSource时触发TypeError: 'int' object is not iterable错误。

出错代码

vertexShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertexShader, 1, open("assets\\vertexSrc.glsl", "r").read(), None)   # 错误发生处
glCompileShader(vertexShader)

错误回溯信息

Traceback (most recent call last):
  File "C:\Users\admin\Desktop\OpenGL\Python\Exploring\main.py", line 44, in <module>
    glShaderSource(vertexShader, 1, vertex_src, None)  # Defining the vertex shader source
  File "src/latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__
  File "src/wrapper.pyx", line 299, in OpenGL_accelerate.wrapper.Wrapper.__call__
  File "src/wrapper.pyx", line 161, in OpenGL_accelerate.wrapper.PyArgCalculator.c_call
  File "src/wrapper.pyx", line 128, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call
  File "src/wrapper.pyx", line 122, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call
  File "C:\Users\admin\AppData\Local\Programs\Python\Python39\lib\site-packages\OpenGL\converters.py", line 305, in stringArray
    value = [as_8_bit(x) for x in arg]
TypeError: ("'int' object is not iterable", <bound method StringLengths.stringArray of <OpenGL.converters.StringLengths object at 0x0000015525B19430>>)

Process finished with exit code 1

解决方法

错误根源是glShaderSource的参数不符合PyOpenGL的绑定要求:

  • 原生OpenGL的glShaderSource要求第三个参数是字符串数组,PyOpenGL的Python绑定需要传入可迭代的字符串序列(如列表),而非单个字符串。
  • 第四个参数若传None,PyOpenGL会尝试自动计算字符串长度,但更稳妥的方式是传入对应长度数组,或直接省略让PyOpenGL自动处理。

修正方案1(简化写法)

vertexShader = glCreateShader(GL_VERTEX_SHADER)
vertex_src = open("assets\\vertexSrc.glsl", "r").read()
# 省略数量和长度参数,PyOpenGL会自动推导
glShaderSource(vertexShader, vertex_src)
glCompileShader(vertexShader)

修正方案2(严格匹配参数要求)

vertexShader = glCreateShader(GL_VERTEX_SHADER)
vertex_src = open("assets\\vertexSrc.glsl", "r").read()
# 第三个参数为包含源码的列表,第四个参数为对应长度的列表
glShaderSource(vertexShader, 1, [vertex_src], [len(vertex_src)])
glCompileShader(vertexShader)

原因说明

当传入单个字符串时,PyOpenGL会将其视为可迭代对象遍历(逐个字符),但第二个参数1表示期望1个完整字符串,两者冲突导致类型错误。将源码放入列表后,PyOpenGL能正确识别这是包含1个元素的字符串数组,匹配参数要求。

内容的提问来源于stack exchange,提问作者user22441564

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:03:30