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 に答える