10

次のシナリオを想像してみてください。スクリプトはIPythonシェルから開始され、ブレークポイントでPythonデバッガーが呼び出されます。PDBコマンドを使用すると、この時点でコードと変数を分析できます。しかし、多くの場合、変数の値はより深い調査を必要とすることがわかります。

変数の値をIPythonシェルにエクスポートすることは可能ですか?

私の特定のユースケース:正しい値を持っていないように見える非常に巨大なnumpy配列に苦労しています。pythonデバッガーから任意のpythonコマンドを実行できることは知っていますが、変数の値をさまざまなブレークポイントに保存し、それらすべてをIPythonシェルで使用すると便利です。私は次のようなものをイメージしています

ipdb> global var1; var1 = var
ipdb> continue
...
ipdb> global var2; var2 = var
ipdb> continue
... 
In [2]: abs(var1 - var2) # do some interesting calculations with IPython
4

3 に答える 3

13

globals()を使用できます。

ipdb>__name__
'my_module'
ipdb> get_var = 'a value'
ipdb> globals()['myvar'] = get_var
ipdb> q
In [11]: my_module.myvar
Out[11]: 'a value'

これは、ブレークポイントがに設定されていることを前提としているmy_module.pyため、モジュールのグローバルを編集していますmy_module

于 2013-02-13T18:00:20.813 に答える
7

きれいな解決策ではありませんが、機能しています:

ipdb> import cPickle; f=open('/tmp/dump1','w+'); cPickle.dump(var,f); f.close()

..。

ipdb> import cPickle; f=open('/tmp/dump2','w+'); cPickle.dump(var,f); f.close()

それから

In [2]: var1 = cPickle.load(open('/tmp/dump1'))
In [3]: var2 = cPickle.load(open('/tmp/dump2'))
于 2013-02-13T17:41:21.600 に答える
3

異なるを区別する必要がありますglobals()
たとえば、次のモジュールがあるとします。mymodule.py

foo = 100
def test():
    bar = 200
    return bar

の制御下で実行しpdbます。

>>> import pdb
>>> import mymodule
>>> foobar = 300
>>> pdb.run('mymodule.test()')
> <string>(1)<module>()
(Pdb) print foobar
300
(Pdb) print foo
*** NameError: name 'foo' is not defined
(Pdb) global foobar2; foobar2 = 301
(Pdb) print foobar2
301

最初、つまり実行する前test()は、pdbの環境が現在の環境globals()です。したがってfoobar、定義されていますが、foo定義されていません。
次に、実行test()して最後に停止しますbar = 200

-> bar = 200
(Pdb) print bar
200
(Pdb) print foo
100
(Pdb) print foobar
*** NameError: name 'foobar' is not defined
(Pdb) global foo2; foo2 = 101
(Pdb) print foo2
101
(Pdb) c
>>> 

pdbの環境が変更されました。mymoduleで'sを使用globals()test()ます。したがって、' is not defined. whilefoobarfoo`が定義されます。

foobar22つの変数とをエクスポートしfoo2ました。しかし、彼らは異なるスコープに住んでいます。

>>> foobar2
301
>>> mymodule.foobar2

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    mymodule.foobar2
AttributeError: 'module' object has no attribute 'foobar2'
>>> mymodule.foo2
101
>>> foo2

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    foo2
NameError: name 'foo2' is not defined

あなたはすでに解決策を見つけました。ただし、動作は少し異なります。

于 2013-02-13T19:37:01.877 に答える