【问题标题】:python function defined but raises NameErrorpython函数定义但引发NameError
【发布时间】:2018-11-04 15:56:33
【问题描述】:

环境: Opensuse Linux 42.3,python 3.4.6,eclipse下运行

对于自动化测试系统,我从测试用例生成 python 脚本。 执行脚本会出错

NameError: name 'setVariable' is not defined

生成的脚本会导入一个名为 testfunc 的模块,该模块定义了函数:

testfunc.py:

import sys

print("defining 'saveDeviceStatus'")
def saveDeviceStatus(devicePath,fq_fileName):
    print("ssaveDeviceStatus:")
    print("device '%s'" % devicePath)
    print("filePath '%s'" % fq_fileName)

print("defining 'setVariable'")
def setVariable(path,value):
    print("setVariable:")
    print("path '%s'" % path)
    print("value '%s'" % value)

print("defining 'compareDeviceStatus'")
def compareDeviceStatus(device,filename,options):
    print("compareDeviceStatus:")
    print("device '%s'" % device)
    print("filename '%s'" % filename)
    print(options)

print("defining 'checkResults'")
def checkResults(checkList):
    print("checkResults:")
    print(checkList)

生成的脚本如下所示:

t_0030_1206_001.py:

#!/usr/bin/python3
#
import time
import os,sys
import importlib.util
spec = importlib.util.spec_from_file_location("testFunctions", "../")
sys.path.append("/home/heinrich/git/swisbox/swibTestPy/pyLib/")
import testfunc

os.chdir('/home/heinrich/git/swisbox/swib61850/test/tryAutomation/nanopi/pilot_dal-static-lib/180525T093506/')
sys.path.append('/home/heinrich/git/swisbox/swibTestPy/src/testlinkFiles/')


# draw actual status
saveDeviceStatus("SWIBCLS1","beforeSwitch_to_1")

checkResults([
    compareDeviceStatus("SWIBCLS1","beforeSwitch_to_1",["nodate"])
    ])

执行脚本输出

$ ./t_0030_1206_001.py 
defining 'saveDeviceStatus'
defining 'setVariable'
defining 'compareDeviceStatus'
defining 'checkResults'
Traceback (most recent call last):
  File "./t_0030_1206_001.py", line 17, in <module>
    saveDeviceStatus("SWIBCLS1","beforeSwitch_to_1")
NameError: name 'saveDeviceStatus' is not defined
$

虽然打印语句已执行,但(对我而言)表明函数已定义,调用它们会导致错误。我在这里想念什么?我可以运行哪些其他诊断程序?

【问题讨论】:

  • 重新考虑 python 导入系统应该是一个好主意 - 非常感谢你指出我这一点。使用的名称可能确实看起来不符合 Python 风格 - 其中许多源自使用 SWIG 的 C/C++ 程序生成的 API 库。

标签: python scope namespaces


【解决方案1】:

这可能会有所帮助:

mod.py:

def my_fun():
    print ("Hello, world")

main.py:

import mod
my_func()

执行:

python3 main.py 
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    my_func()
NameError: name 'my_func' is not defined

你可以通过导入函数来修复

from mod import my_fun

或使用:

mod.my_fun()

因此,在您的情况下,请使用:testfunc.saveDeviceStatus(..) 或使用 from testfunc import saveDeviceStatus

【讨论】:

    【解决方案2】:

    首先,该错误是在抱怨saveDeviceStatus,而不是setVariable

    不过,这应该不会让您感到惊讶;您不会在任何地方导入saveDeviceStatus。你 import testfunc;所以你应该通过那个名字来引用函数。

    testfunc.saveDeviceStatus("SWIBCLS1","beforeSwitch_to_1")
    
    testfunc.checkResults([
        testfunc.compareDeviceStatus("SWIBCLS1","beforeSwitch_to_1",["nodate"])
    ])
    

    还请注意,这一切都非常不符合 Python 风格;你应该使用lower_case_with_underscores 作为函数名,而不是camelCase

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多