从另一个文件导入时的Python nameError帮助

时间:2018-07-20 00:53:56

标签: python maya

我在maya中有一个功能,该功能可以导入其他功能,并创建一个带有用于特定功能按钮的架子。我有一个功能可以正常工作的scriptJob命令。如果我手动而不是通过任务栏按钮导入该文件,但是在使用任务栏脚本运行该文件时给出了NameError。

这是脚本的示例 myShelf.py文件:

import loopingFunction
loopingFunction.runThis()

loopingFunction.py文件:

import maya.cmds as mc
def setSettings():
    #have some settings set before running this
    runThis()

def runThis():
    print "yay this ran"
    evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',runThis"])

如果通过架子功能运行此命令,则会得到一个runThis nameError is not defined,如果尝试将scriptJob命令修改为loopingFunction.runThis,则会得到一个nameError loopingFunction is not defined(不确定是否使用{{ 1}}甚至是正确的,老实说

不知道如何解决该问题而不必手动导入函数而不是通过文件架文件。

2 个答案:

答案 0 :(得分:1)

将字符串引用用于此类回调函数通常会导致范围问题。 (有关更多信息,以及为什么不使用字符串,here

如果您将函数作为对象直接传递给回调,而不是使用字符串,则它应该与实际导入的代码一样正常工作。

在这种情况下,您需要evalDeferred-您是否确实需要它? -因此有助于在实际代码周围添加一些功能,以便稍后实际创建scriptjob –否则,将在安排延迟之前对其进行评估。

import tkinter as tk

win_about = tk.Tk()
win_about.geometry("340x500")
win_about.title("About Us")
win_about.resizable(0,0)

label = tk.Label(win_about, text="img_png", fg="black")
label.place(anchor='center', relx =.5, rely=.3)

mess = tk.Label(win_about, text='Version: 1.0', font=12)
mess.place(anchor='center', relx=.5, rely=.7)

win_about.mainloop()

def runThis(): print "callback ran" def do_scriptjob(): cmds.scriptJob(ro=True, ac=('someMesh.outMesh', runThis) cmds.evalDeferred(do_scriptjob) runThis中,我都没有添加括号-我们让evalDeferred和scriptJob具有函数 objects ,它们在准备就绪时可以调用。使用括号会传递函数的结果,这不是您想要的。

偶然地,您似乎正在尝试在scriptJob自身内部创建scriptJob的新副本。最好只是放下do_scriptjob标志,而让scriptJob摆在身边-如果runOnce中的某些内容实际上影响了runThis属性,则您的Maya将会陷入无限循环。我没有在示例中更改结构,但如果可以避免的话,我不建议编写这种自我复制代码。

答案 1 :(得分:0)

您遇到了嵌套/玛雅范围变量的问题

mc.scriptJob(ro=True,ac=["'someMesh.outMesh',runThis"]

此行是在主maya范围(如全局)中求值的maya命令字符串。 由于您的函数具有一个带有import的名称空间:“ loopingFunction”,因此您需要在字符串命令中对其进行强制。

import loopingFunction
loopingFunction.runThis()

您应该写

evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',loopingFunction.runThis"])

如果您想要更一般的内容,可以这样做:

def runThis(ns=''):
    print "yay this ran"
    if ns != '':
        ns += '.'
    evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',{}runThis".format(ns)])

然后在架子上运行:

import loopingFunction
loopingFunction.runThis('loopingFunction')

像这样,您可以编写任何形式的namepsaces:

import loopingFunction as loopF
loopF.runThis('loopF')