我正在使用 Python 2.7.3 在 OpenERP 中调试一些东西。使用 Next (n) 命令单步执行时,调试器似乎与代码不同步。当您键入诸如打印变量之类的调试器命令时,每次执行此操作时它可能会给出不同的答案。单步执行代码时,它似乎也会向后跳过。请参阅下面的代码和输出。
我相信这个问题可能与 OpenERP 通过读取下面 OpenERP XML 中的代码字段通过 Python exec() 语句调用我的方法的方式有关。调用动态构造并通过 exec() 调用的 Python 代码是否可能会混淆 pdb 调试器?当我从 Button 而不是 aa tree_but_open 事件调用该函数时,调试器将逐步执行代码。
如果是这种情况,是否有解决方法?
通过以下 OpenERP 操作调用 CODE:
<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”两次才能打印值):
-> 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)>