0

所以在工作中,我正在为我们开发一种将工具/插件推向整个团队的方法。我实际上已经启动并运行了系统,它是完全动态的,除了我要谈论的主题(这都是在 python 中完成的)。在启动时,Maya 会根据服务器上的文件夹检查本地文件夹,并检查它们是否不同,并处理和复制所需的文件/目录,以及删除我们在服务器上删除的旧插件。该系统足够灵活,用户可以创建所有插件的自定义架子,我们可以在不破坏所有用户架子的情况下重新组织后端的文件夹。插件是通过 Maya 主界面中的下拉菜单访问的,我们可以在系统和插件中自由添加子文件夹,而不会弄乱代码。

这一切都很好,直到我开始制作插件,当他们在他们的文件夹中导入一个模块时,也是动态的。因此,当我开始在根目录周围移动插件文件夹时,如果我有一个为其创建路径的导入模块,那么插件脚本中的导入模块路径现在是错误的。我已经有办法通过我的菜单设置获取插件的正确路径信息。我在导入模块和访问该模块中的类时遇到问题。

所以如果导入模块类的标准

from fileName import className

__import__我使用的方式看起来像。

className = __import__("folderN.folderN.folderN.fileName", {}, {}, ["className"])

但是使用该方法,我失去了像使用常规 from import 方法一样调用该类名的能力。我通过这样做解决了这个问题

className = className.className

但这是一个相当丑陋的方法,我希望能够只导入和调用名称而不做额外的步骤。我不太了解这种导入方法,我知道我缺少一些东西。

我只是以错误的方式进行此导入过程吗?有没有办法让它在不附加到maya路径的情况下查看插件的本地目录,这样我就可以执行导入方法的常规方式,而没有在我移动插件时必须更改的奇怪路径?

4

1 回答 1

0

__import__ doesn't work they way you are assuming. It returns a module object for the import path provided, with a guarantee that all the children you specify in the list have been explicitly imported. For classes, it doesn't really make a difference.

mod = __import__('a.b', {}, {}, ['c', 'd'])

Is more accurately the equivalent of

import a.b
try:
    import a.b.c
except ImportError:
    pass
try:
    import a.b.d
except ImportError:
    pass
mod = a.b

What you actually probably want here is something like

child = getattr(__import__(import_path, {}, {}, [child_name]), child_name)

As to your versioning and distribution system, have you looked at using an SCM/VCS like SVN or GIT, and/or a package management system? These give you much better change tracking and synchronization than a straight file share, and you could easily integrate them with a sync/install script on your client machines that could be customizable as needed for the client's specific configuration demands.

于 2013-05-23T14:47:28.093 回答