【问题标题】:Global name 'display' is not defined during "exec()"“exec()”期间未定义全局名称“display”
【发布时间】: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


【解决方案1】:

您发送然后执行的字符串到底是什么?

您的错误听起来像是您只发送了 main() 函数,这不起作用。

【讨论】:

  • 整个程序“画线”(我在上面发布的)通过网络发送到客户端并存储在变量“b”中。我在客户端给出了一个打印语句,即打印 b。整个程序被打印出来,所以整个程序被发送并存储在变量中。我尝试发送一个带有函数的简单程序 print 'hello world' 并显示相同的错误。使用函数时出现一些问题。我怎样才能让它发挥作用?
  • 我试过的简单程序: def hel(): print 'hello world' return def main(): hel() main() error: Exception in thread Thread-1: Traceback (最近一次调用最后):文件“/usr/lib/python2.6/threading.py”,第 532 行,在 __bootstrap_inner self.run() 文件“r13client.py”,第 31 行,运行 exec(b) 文件“ ",第 6 行,在 文件“”中,第 5 行,在主 NameError 中:未定义全局名称 'hel'
  • @Ani Sunny:嗯,这是一个有趣的错误。我无法想象为什么。但是您的解决方案无疑是错误的。不要像这样来回发送整个程序,你没有理由这样做。相反,在服务器上定义 display() 和 main(),并且只通过网络发送参数。问题解决了。
  • 你好.. 我找到了一种方法来消除错误并让程序运行。我在一个类中声明了显示函数并将该类存储在一个全局变量中。然后在调用函数时,变量充当类的对象(variable.function_name)。我从网络本身得到了这个想法。这只是为了看看我是否可以将代码从一个系统发送到另一个系统并在另一个系统上执行它。要创建一个网络渲染引擎,整个渲染程序的一部分将在网络中的不同计算机之间进行划分,对吗?这就是我尝试这个的原因。
  • 我正在研究一种通过在两个不同系统之间进行任务来绘制一条线的方法。一个系统一半线路,另一个系统一半。我正在尝试找到一种方法来做到这一点。
【解决方案2】:

有关网络和图形的一种方法的示例,请查看https://launchpad.net/game

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2015-12-22
    • 2014-04-18
    • 2015-08-08
    • 2011-04-27
    相关资源
    最近更新 更多