Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从其他文件导入时的Python名称错误帮助_Python_Maya - Fatal编程技术网

从其他文件导入时的Python名称错误帮助

从其他文件导入时的Python名称错误帮助,python,maya,Python,Maya,我在maya中有一个函数,可以导入其他函数,并创建一个带有特定函数按钮的工具架。我有一个函数,它有一个scriptJob命令,可以正常工作。如果我手动而不是通过shelf按钮导入该文件,但在使用shelf脚本运行该文件时,会给出一个NameError 这是脚本的一个示例 myShelf.py文件: import loopingFunction loopingFunction.runThis() loopingFunction.py文件: import maya.cmds as mc def s

我在maya中有一个函数,可以导入其他函数,并创建一个带有特定函数按钮的工具架。我有一个函数,它有一个scriptJob命令,可以正常工作。如果我手动而不是通过shelf按钮导入该文件,但在使用shelf脚本运行该文件时,会给出一个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"])
如果我通过shelf函数运行它,我会得到一个
runThis nameError未定义
,如果我尝试将scriptJob命令修改为
loopingFunction。运行这个
,我会得到一个
nameError loopingFunction未定义
(不确定是否使用
loopingFunction。老实说,运行这个
甚至是正确的)


不确定如何在不必手动导入函数而不是通过工具架文件的情况下绕过此问题。

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

mc.scriptJob(ro=True,ac=["'someMesh.outMesh',runThis"]
此行是maya命令字符串,在maya主作用域中求值(类似于全局) 由于函数有一个带有import的名称空间:“loopingFunction”,因此需要在string命令中强制执行它

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')
像这样,你可以写任何形式的名字:

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

对这样的回调函数使用字符串引用通常会导致范围问题。(更多关于这一点,为什么不使用字符串呢?)

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

在这种情况下,您需要一个EvalDerred--您真的需要它吗?--因此,在实际代码周围添加一个小函数有助于以后实际创建scriptjob,否则将在计划延迟之前对其进行评估

def runThis():
    print "callback ran"

def do_scriptjob():
    cmds.scriptJob(ro=True, ac=('someMesh.outMesh', runThis)

cmds.evalDeferred(do_scriptjob)
runThis
do_scriptjob
中,我没有添加参数——我们让evaldeered和scriptjob在准备就绪时调用函数对象。使用paren将传递函数的结果,这不是您想要的结果

顺便说一句,看起来您正试图在scriptJob本身内部创建scriptJob的新副本。最好是去掉
runOnce
标志,让scriptJob留在周围——如果
runThis
中的某些内容实际影响了
someMesh.outMesh
属性,maya将进入无限循环。在我的示例中,我没有更改结构,但是如果您可以避免的话,我不建议编写这种自我复制的代码