【发布时间】:2011-01-10 10:44:02
【问题描述】:
我尝试使用 exec() 执行一个简单的线条绘制程序。 它工作得很好。但是,当我尝试通过 tcp/ip 网络发送它来执行相同的程序时(服务器读取程序并将其发送到客户端,客户端将其接收到字符串类型的变量(b))然后我使用 exec(b ) 在客户端执行它,但它说: NameError: 未定义全局名称“显示”
画线代码为:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys
name = 'line'
def display():
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glPushMatrix()
glTranslatef(-1,-1,0)
gluLookAt(
0.1, 0.1, 0.3,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glLineWidth(3.0)
color = [1.,1.,1.,1.]
glBegin(GL_LINES)
glVertex3f(0,0,0) # origin of the line
glVertex3f(.5,1.0,.9) # ending point of the line
glEnd()
glPopMatrix()
glutSwapBuffers()
return
def main():
glutInit(sys.argv)
print 'hello'
glutCreateWindow(name)
glClearColor(0.4,0.5,0.3,1.0)
glutDisplayFunc(display)
glutMainLoop()
return
main()
这部分客户端代码接收程序并将其存储到变量中,然后我们使用exec():
while f:
a = client.recv(1024)
if a=="#p":
f=0
break
b+=a
print b
exec(b)
代码执行到给出 print hello 的部分,然后停止。
错误信息:
hello
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "r13client.py", line 31, in run
exec(b)
File "<string>", line 34, in <module>
File "<string>", line 31, in main
NameError: global name 'display' is not defined
我无法理解这里出了什么问题。如果有人可以提供帮助,我将不胜感激。
【问题讨论】:
-
等等,什么?您是否通过网络发送整个代码,然后在客户端上执行()它!?这可能不是实现您尝试实现的任何内容的正确方法。 :)
-
你问了三个问题。尽管您的示例不包含网络编程,但你们都使用相同的标题“Python 中的网络编程”。另外,你从不回答人们问你的问题。这不是获取 Stackoverflow 帮助的正确方法。
-
是的,我确实发送了整个代码。我和我的朋友正在尝试在 OpenGL 中创建一个网络渲染引擎。我们刚刚开始使用它并正在尝试发送代码并执行它。这些只是开始的步骤。我们没有 python 或 Opengl 方面的先验知识(我们在做项目的同时也在学习),也没有太多的网络编程经验,所以如果有人可以帮助我们,我们将不胜感激。
-
hello TryPyPy... print b 打印接收到的程序。我们这样做是为了检查是否收到了整个程序。
-
通过网络发送代码是错误的解决方案。不要那样做。在渲染机中定义渲染函数,只发送数据。即,发送“drawLine 0 0 45 67”绘制一条从 0,0 到 45,67 的线。不要发送画线的函数。太疯狂了...简而言之:不要使用
exec()
标签: python networking