使用eval()函数时的NameError

时间:2013-10-18 06:45:45

标签: python python-2.7

我试图通过使用它成功调用的eval()函数从另一个模块调用模块但是在控制台输出中我收到错误消息,例如" NameError:name' Login_CSA'未定义"

我已经编写了这样的代码

在sample.py模块中

import ReferenceUnits

def calling():
    str='Login_CSA'
    eval(str)

calling()

在ReferenceUnits.py

import Login_CSA

并在Login_CSA.py中写过

def Hai():
    print "hello this is somesh"
    print 'hi welcome to Hai function'

Hai()

它正在执行,但最终收到错误消息,如"NameError: name 'Login_CSA' is not defined"

为什么会这样?

3 个答案:

答案 0 :(得分:2)

我的猜测是你试图“包含并评估第二个脚本”,就像你在PHP中所做的那样。在Python中,当您import文件时,所有方法都可以在本地脚本中使用。因此,不是eval文件,而是从它调用方法。

import ReferenceUnits
import Login_CSA

def calling():
    Login_CSA.Hai()

if __name__ == "__main__":
    calling()

并将Login_CSA.py更改为

def Hai():
    print "hello this is somesh"
    print 'hi welcome to Hai function'

if __name__ == "__main__":
    Hai()

if __name__ == "__main__":块很重要,因为它会阻止导入的脚本在import期间执行代码(您很少想在导入时执行代码)。

答案 1 :(得分:1)

函数eval()执行有效的python表达式,例如:

>>> x = 1
>>> print eval('x+1')
2

在您的情况下,eval()函数会查找根本不存在的变量Login_CSA,因此返回NameError: name 'Login_CSA' is not defined

答案 2 :(得分:1)

如果你

  • 导入Login_CSA中的ReferenceUnits.py
  • 导入ReferenceUnits中的sample.py

您必须访问

  • ReferenceUnits使用ReferenceUnits
  • Login_CSA使用ReferenceUnits.Login_CSA
  • Hai使用ReferenceUnits.Login_CSA.Hai

所以你可以做到

def calling():
    str='ReferenceUnits.Login_CSA.hai'
    eval(str)() # the () is essential, as otherwise, nothing gets called.

calling()