PyWin Debugger の使用

 
 
 

PyWin Debugger は、Python のデバッグ機能を使用して、Softimage 内で実行されているスクリプトをデバッグできるインタラクティブな GUI です。 この定義モジュールは、pdb モジュール(標準的な Python デバッガ)上でビルドされる debugger です。

デバッグ機能

PyWin Debugger には、スクリプトのデバッグを支援する、次のようなデバッグ ツールが用意されています。

アクション

ツールバー

メニュー

ホットキー

ブレークポイントの設定と消去

 

[ファイル]>[デバッグ]>[Toggle Breakpoint]

F9

スクリプトのステップ実行

 

[ファイル]>[デバッグ]>[Step in]

[ファイル]>[デバッグ]>[Step out]

F10

F11

コール スタックの表示(スクリプト内から呼び出すスクリプトをデバッグするときに役立ちます)

 

 

 

変数の設定と表示。

 

 

 

Python モジュール(Python Object Browser)または COM typelib(COM Browser)内で利用できるものの確認

 

[ツール]>[Browser]

[ツール]>[COM Browser]

 

COM ライブラリを Python の静的ディスパッチ モジュールに変換

 

[ツール]>[COM Makepy utility]

 

win32traceutil を使用する任意のプログラムからの出力の表示

 

[ツール]>[Trace Collector Debugging tool]

 

PyWin Debugger を呼び出す

推奨されている pywin32 拡張モジュールを使用している場合、PyWin Debugge rはすでにインストールされていて、呼び出す準備ができています。 このデバッガは Python モジュールであるため、使用する前に読み込んでおく必要があります。

# This loads the debugger module...
import pywin.debugger as dbg

# This launches the GUI:
dbg.brk()

以下のコードでも、デバッガを呼び出すことができます。

dbg.set_trace()
ヒント:

Script Editor のコンテキスト メニューには、このコードを自動挿入するオプションがあります。

デバッガからのSoftimageの制御

PyWin Debugger は Softimage と直接対話するため、インタラクティブなウィンドウ内にコマンドを入力して Softimage を制御できます。 たとえば、デバッガのインタラクティブなウィンドウ内で「Application.LogMessage("Debug this!")」と入力して[Enter]キーを押すと、Softimage のヒストリ ペインに「"Debug this!"」とログが記録されます。

AutoComplete を拡張する

PyWin Debugger のインタラクティブなウィンドウを修正し、オートコンプリート プロンプトで Softimage オブジェクトが自身のすべてのメソッドを表示するように設定できます。

  • %PythonPath%\Lib\site-packages\pythonwin\pywin\scintilla\view.py ファイルを編集し、_AutoComplete 関数内に以下の行を追加します(コンテキスト行を使用してコードを挿入する場所を見つけます)。

            # The object may be a COM object with typelib support - lets see if we can get its props.
            # (contributed by Stefan Migowsky)
            try:
                # Get the automation attributes
                items_dict.update(ob.__class__._prop_map_get_)
                # See if there is an write only property 
                # could be optimized
                items_dict.update(ob.__class__._prop_map_put_)
                # append to the already evaluated list
            except AttributeError:
                pass
 # BEGIN ADDED LINES
            # The object might be a pure COM dynamic dispatch with typelib support - lets see if we can get its props.
            if hasattr(ob, "_oleobj_"):
                try:
                    for iTI in xrange(0,ob._oleobj_.GetTypeInfoCount()):
                        typeInfo = ob._oleobj_.GetTypeInfo(iTI)
                        typeAttr = typeInfo.GetTypeAttr()
                        for iFun in xrange(0,typeAttr.cFuncs):
                            funDesc = typeInfo.GetFuncDesc(iFun)
                            funName = typeInfo.GetNames(funDesc.memid)[0]
                            if not items_dict.has_key(funName):
                                items_dict[funName] = 1
                except:
                    pass
 # END ADDED LINES
        except:
            win32ui.SetStatusText("Error attempting to get object attributes - %s" % ('sys.exc_info()[0]',))