所以我一直在做很多研究,但找不到合适的答案。我对python很新,很抱歉,如果这是一个简单的问题。
所以,基本上,我正在创建一个具有按钮的UI,该按钮应该从另一个.py文件调用一个函数。到目前为止我所做的是将文件的文件夹附加到sys.path并将.py文件作为其他内容导入。例如,假设我正在导入myTools.py:
import myTools as mt
现在我可以通过mt.mainFunction()或mt的任何内容成功访问myTools中的所有函数。前缀。
现在我的问题:
当我直接运行mt.myFunction()时它工作得很好。问题是mainFunction()是另一个在不同时间调用不同函数的UI。所有这些函数都在myTools文件中..但是Maya不会找到它们,因为当它们在mainFunction()中被调用时,它们没有mt前缀。 我的意思是,我可以在userSetup.py上运行那些defs,但它是一个非常大的代码,我想以最干净的方式做到这一点:)
有什么想法吗?
提前致谢!
编辑:
所以我才意识到只有一个功能不起作用。我收到这个错误:
# Error: NameError: file <maya console> line 1: name 'annotationToLocator' is not defined #
由于这个错误,我认为我的main函数在模块上找不到任何其他功能。
我声明此函数的实际代码:
jobNum = cmds.scriptJob(e=['SelectionChanged', 'annotationToLocator()'])
def annotationToLocator ():
selList = cmds.ls(sl=True)
for item in selList:
if '_ANN' in str(item):
cmds.select(item,d=True)
newItem = str(item).replace('_ANN', '_LOC')
cmds.select(newItem,add=True)
关于这个的一些奇怪的事情: 1)当我直接运行代码时它非常有效。
2)我正在导入userSetup文件中的模块..我不仅在尝试实际运行调用此函数的函数时,而且在Maya启动时也收到错误。
我尝试评论scriptjob行,现在它工作正常,但显然现在我没有运行scriptjob。我认为模块和scriptjobs有些问题吗?!
对不起,我知道我离开了原来的问题路径! :)
答案 0 :(得分:0)
这听起来像典型的python行为,应该可以正常工作。每个模块都有自己的全局范围,该模块中定义的每个函数都可以访问该范围中定义的所有内容。
因此在myTools
模块中,每个函数都可以通过名称相互访问,并且主模块中定义的每个函数都可以访问mt
模块对象,并可以获取函数的属性
答案 1 :(得分:0)
您的问题源于对函数使用字符串引用。虽然这有效,但只有 才能运行,如果它们通过字符串调用是在全局python范围内 - 这通常意味着它只能在监听器中工作。
执行任何maya回调的更好方法是将函数作为函数对象直接传递给回调,而不是作为字符串:
import mymodule
cmds.scriptJob(e=('somethingSelected', mymodule.fancyfunction))
请注意mymodule.fancyfunction
传递没有parens :您告诉Maya“使用此功能”。如果您以mymodule.fancyfunction()
的身份执行此操作,则会告诉Maya使用调用函数的结果,而不是函数本身。