Python 2.7.3 を使用して OpenERP で何かをデバッグ中です。Next (n) コマンドでステップ実行すると、デバッガーがコードと同期しなくなるようです。print variable などのデバッガー コマンドを入力すると、これを行うたびに異なる応答が返される場合があります。また、コードをステップ実行するときに後方にスキップするようにも見えます。以下のコードと出力を参照してください。
この問題は、以下の OpenERP XML のコード フィールドを読み取って、OpenERP が Python exec() ステートメントを介してメソッドを呼び出す方法に関連していると思われます。動的に構築され、exec() を介して呼び出される Python コードを呼び出すと、pdb デバッガーが混乱する可能性はありますか? tree_but_open イベントではなく Button から関数を呼び出すと、デバッガーはコードをうまく処理します。
この場合、回避策はありますか?
CODE は、以下の OpenERP アクションを介して呼び出されます。
<record id="action_wash_st_method1" model="ir.actions.server">
<field name="type">ir.actions.server</field>
<field name="condition">True</field>
<field name="state">code</field>
<field name="model_id" ref="model_view_tree_display_address_list"/>
<field eval="5" name="sequence"/>
<field name="code">
action = self.view_calc_sales_tax(cr, uid, context)
</field>
<field name="name">wash state action request</field>
</record>
<record model="ir.values" id="action_wash_st_tax_trigger_method1" >
<field name="key2" eval="'tree_but_open'" />
<field name="model" eval="'view.tree.display.address.list'" />
<field name="name">Method1 Wash State</field>
<field name="value" eval="'ir.actions.server,%d'%action_wash_st_method1"/>
<field name="object" eval="True" />
</record>
PDB/CODE OUTPUT (値を出力するには、「ids」を 2 回入力する必要があることに注意してください):
-> ctx["local_rate"] = res1["local_rate"]
(Pdb) n
> /home/glenn2/openerp6.1/addons/6.1/wash_tax2/wash_tax.py(169)view_calc_sales_tax()
-> ctx["code"] = res1["code"]
(Pdb) n
> /home/glenn2/openerp6.1/addons/6.1/wash_tax2/wash_tax.py(172)view_calc_sales_tax()
-> ids = [3333,4444,9999]
(Pdb) n
(Pdb) > /home/glenn2/openerp6.1/addons/6.1/wash_tax2/wash_tax.py(173)view_calc_sales_tax()
-> self.pool.get('account.invoice').button_reset_taxes (cr,uid, ids, ctx)
ids
*** NameError: name 'ids' is not defined
(Pdb) ids
[3333, 4444, 9999]
(Pdb)
追加情報:
複数のスレッドに問題があるデバッガーに関係していると思います。この問題は、Python のスレッド ライブラリで __bootstrap_inner() を呼び出した後に発生し始めます。複数のスレッドで Python デバッガーを有効にできるかどうかは誰にもわかりません。
(Pdb) > /home/glenn2/usr/local/lib/python2.7/threading.py(526)__bootstrap()
-> self.__bootstrap_inner()
>(Pdb) /home/glenn2/usr/local/lib/python2.7/threading.py(526)__bootstrap()->None
-> self.__bootstrap_inner()
self
(Pdb) <Thread(Thread-35, initial)>
self
<Thread(Thread-34, stopped 47994097374976)>
(Pdb) self
(Pdb) <Thread(Thread-34, stopped 47994097374976)>
self
(Pdb) <Thread(Thread-35, initial)>
self
(Pdb) <Thread(Thread-34, stopped 47994097374976)>
self
(Pdb) <Thread(Thread-35, initial)>
self
(Pdb) <Thread(Thread-34, stopped 47994097374976)>
self
<Thread(Thread-35, initial)>
(Pdb) self
(Pdb) <Thread(Thread-34, stopped 47994097374976)>