【问题标题】:NameError: name '__main__' is not defined [closed]NameError:名称'__main__'未定义[关闭]
【发布时间】:2014-03-18 23:42:34
【问题描述】:

我一直在这里阅读,但我在网上找不到任何解决方案来解决我的问题..我认为我的缩进正确,但我仍然收到名称错误..有人可以帮助我吗? 这个脚本应该在 Maya 中运行一个新面板,这有点工作,但这个错误真的很烦人。

class PanelWindow( object ):
    def __init__( self, name, title, namespace=__name__ ):
        self.__name__ = name
        self._title = title
        self.instance = str(namespace) + '.' + self.__name__

        if not pm.scriptedPanelType(self.__name__, q = True, ex = True):
            pm.scriptedPanelType(self.__name__, u = True)

        jobCmd = 'python(\\\"%s._setup()\\\")' % self.instance
        job = "scriptJob -replacePrevious -parent \"%s\" -event \"SceneOpened\" \"%s\";" % ( self.__name__, jobCmd )
        mel.eval(job)

        pm.scriptedPanelType( self.__name__, e = True,
                       unique=True,
                       createCallback = 'python("%s._createCallback()")' % self.instance,
                       initCallback = 'python("%s._initCallback()"  )' % self.instance,
                       addCallback = 'python("%s._addCallback()"   )' % self.instance,
                       removeCallback = 'python("%s._removeCallback()")' % self.instance,
                       deleteCallback = 'python("%s._deleteCallback()")' % self.instance,
                       saveStateCallback = 'python("%s._deleteCallback()")' % self.instance
                        )


    def _setup(self):
        """Command to be call for new scene"""
        panelName = pm.sceneUIReplacement( getNextScriptedPanel=(self.__name__, self._title) )
        if panelName == '':
            try:
                panelName = pm.scriptedPanel( mbv=1, unParent=True, type=self.__name__, label=self._title )
            except:
                pass
        else:
            try:
                label = panel( self.__name__, query=True, label=True )
                pm.scriptedPanel( self.__name__, edit=True,  label=self._title )
            except:
                pass
    def _addCallback(self):
        """Create UI and parent any editors."""
        print 'ADD CALLBACK'
    def show( self ):        
        mel.eval('tearOffPanel "%s" %s true;' % (self._title, self.__name__) )


global test
test = PanelWindow('myName', 'Light')

test.show()


# NameError: name '__main__' is not defined # 
# Error: line 1: name '__main__' is not defined
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# NameError: name '__main__' is not defined # 

【问题讨论】:

  • 您的代码中没有__main__。向我们展示导致此错误的实际代码
  • 看起来你使用了一些非标准的 python 控制台(maya-console)......这可能是问题......我会检查他们的论坛
  • ... 请发布一个 minimal 代码来显示此问题。你 99% 的代码在这里是无关紧要的。
  • @JoranBeasley,maya 有一个内置的脚本编辑器和 python 解释器。 __main__ 仍然必须在代码中的某个地方。
  • 作为每个工作日都使用 Maya 的人,我向你保证不是。

标签: python main maya


【解决方案1】:

在执行 Python 脚本时,Python 解释器将名为 __name__ 的变量设置为正在执行的模块的字符串值 "__main__"(通常此变量包含模块名称)。

检查这个变量的值是很常见的,看看你的模块是被导入用作库,还是直接执行。所以你经常会在模块的末尾看到这段代码:

if __name__ == '__main__':
    # do stuff

我怀疑您已将字符串引号从 '__main__' 中删除,这会导致您看到的 NameError

>>> if __name__ == __main__:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__main__' is not defined

【讨论】:

    【解决方案2】:

    您的问题是一些问题,我只包含了代码的几个基本部分,因为其余部分不需要。

    问题之一是__name__,如果被引用,我们不会有问题,因为它只是一个名字,没有什么特别的,我只是要把它重命名为name

    问题二是面板/面板类型上的重复名称。即:

    pm.scriptedPanelType(self.__name__, u = True)
    pm.scriptedPanel( self.__name__, edit=True,  label=self._title )
    

    Maya 不喜欢 panelType 和 panel 具有相同的名称。

    所以:

    import maya.cmds as cmds
    import pymel.core as pm
    import maya.mel as mel
    
    class PanelWindow( object ):
        def __init__(self, name, title):
    
            self._name = name
            self._title = title
            self.panelTypeName = self._name + "Type"
    
    
    
            if not pm.scriptedPanelType(self.panelTypeName, query=True, exists=True):
                pm.scriptedPanelType(self.panelTypeName, unique=True)
    
            if not pm.scriptedPanel(self._title, query=True, exists=True):
                ## Only allows one instance
                pm.scriptedPanel(self._title, menuBarVisible=1, unParent=True, type=self.panelTypeName, label=self._title )
    
        def _addCallback(self):
            """Create UI and parent any editors."""
            print 'ADD CALLBACK'        
    
    
        def show( self ):  
            mel.eval('tearOffPanel "%s" "%s" true;' % (self._title, self._name) )  
    
    
    
    PanelWindow('lightControlType1', 'lightControl').show()
    

    【讨论】:

    • 虽然在namespace 上调用str 似乎毫无意义,但这极不可能与错误有关。
    • 它消除了 main 错误,现在我得到:# Error: 'PanelWindow' object has no attribute 'name' # Traceback (最近一次调用最后一次): # File " ", line 50, in # File "", line 9, in init # AttributeError: 'PanelWindow' object has no attribute 'name' #跨度>
    • ...或者我错过了一些东西。我倾向于认为差异是由于与此更改无关的某些原因,例如关闭并再次打开解释器,但暂时删除了否决。
    • 你运行的是哪个版本的 Maya @arvidurs?
    • 嗯,奇怪,我现在关闭了好几次..仍然得到错误。我会再尝试。无论如何感谢您的努力!
    猜你喜欢
    • 2021-08-23
    • 2016-12-20
    • 2023-03-05
    • 2020-12-23
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多