1

我正在尝试通过使用eval()它成功调用的函数从另一个模块调用一个模块,但在控制台输出中我收到错误消息,例如“NameError:名称'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"

为什么会这样?

4

3 回答 3

2

我的猜测是您正在尝试像在 PHP 中那样“包含并评估第二个脚本”。在 Python 中,当您import创建一个文件时,所有方法都可以在您的本地脚本中使用。eval因此,您只需从中调用方法,而不是ing 文件。

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(您很少希望在导入时执行代码)。

于 2013-10-18T08:34:39.047 回答
1

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

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

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

于 2013-10-18T08:04:29.750 回答
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()
于 2013-10-18T08:41:42.120 回答