因此,在工作中,我正在为我们开发一种方法,将工具/插件推送到团队整体。我实际上已经启动并运行了系统,它完全是动态的,除了我要谈论的主题(这都是在python中完成的)。在启动时,Maya会根据服务器上的文件夹检查本地文件夹,并检查它们是否不同,并处理和复制所需的文件/目录以及删除我们在服务器上删除的旧插件。该系统足够灵活,用户可以创建所有插件的自定义架子,我们可以在后端重新组织文件夹,而不会破坏所有用户的架子。可以通过Maya主界面的下拉菜单访问插件,我们可以将子文件夹添加到系统中并自由插件而不会弄乱代码。我们还可以通过文件夹的简单编号系统来安排菜单项和插件的显示顺序。
这一切都正常,直到我开始制作插件,当他们在他们的文件夹中导入模块时,也是动态的。因此,当我开始在根目录周围移动plugins文件夹时,如果我有一个我创建路径的导入模块,那么插件脚本中导入的模块路径现在就错了。我已经有办法通过菜单设置获取插件的正确路径信息。我遇到了导入模块和访问该模块中的类的问题。
所以如果导入模块类的标准
from fileName import className
以及我正在使用的__import__
方式。
className = __import__("folderN.folderN.folderN.fileName", {}, {}, ["className"])
但是通过这种方法,我放弃了使用常规from import方法调用类名的能力。我通过做
来解决这个问题className = className.className
但这是一个相当丑陋的方法,我宁愿只能导入并调用名称,而无需执行额外的步骤。我不太了解这种导入方法,我知道我错过了一些东西。
我是否只是以错误的方式处理此导入过程?有没有办法让它查看插件的本地目录而不附加到maya的路径,这样我就可以按常规方式导入方法,而不需要在移动插件时随时更改的奇怪路径?
答案 0 :(得分:0)
__import__
无法按照您的假设运作。它返回所提供的导入路径的模块对象,并保证已显式导入您在列表中指定的所有子项。对于课程来说,它并没有什么不同。
mod = __import__('a.b', {}, {}, ['c', 'd'])
更准确地等同于
import a.b
try:
import a.b.c
except ImportError:
pass
try:
import a.b.d
except ImportError:
pass
mod = a.b
你实际上可能想要的是
child = getattr(__import__(import_path, {}, {}, [child_name]), child_name)
关于您的版本控制和分发系统,您是否考虑过使用SCN / VCS(如SVN或GIT)和/或包管理系统?与直接文件共享相比,这些可以为您提供更好的跟踪和同步更改,您可以轻松地将它们与客户端计算机上的同步/安装脚本集成,这些脚本可根据客户端的特定配置需求进行自定义。