奇怪的IPython ipdb行为

mar*_*rue 18 python ipython pdb

我有一些非常奇怪的行为,我只是不明白,因此无法解释,所以我希望有人可以帮助我.我注意到的第一件事是ipdb不再让我定义变量:

ipdb> what=5
ipdb> what
*** NameError: name 'what' is not defined
whatelse=6
Run Code Online (Sandbox Code Playgroud)

稍后我发现ipdb在我的输入上返回了这个(在再次运行代码之后):

dir()
ipdb> ['args', 'content_type', 'function', 'ipdb', 'item_code', 'kwargs', 'object_id', 'request', 'ud_dict', 'update_querydict', 'what', 'whatelse']
what=5
ipdb> what
5
ipdb> whatelse=7
ipdb> whatelse
ipdb> 6
whatelse
ipdb> 7
whatelse
ipdb> 6
whatelse
ipdb> 7
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来像我有两个交错调试会话,我可以访问一些奇怪的交替模式.我怎么能摆脱它呢?

编辑: 杀死所有python进程并重新运行代码确实有帮助.现在一切都恢复正常了.但是由于我不明白发生了什么,我会对发生的事情以及如何重现行为非常感兴趣.

mhl*_*ter 9

如果您每次使用两个进程stdin,它们可能会导致与您所描述的症状非常相似的症状.

>>> import subprocess
>>> subprocess.Popen('python', shell=True)
<subprocess.Popen object at 0x0000000001DEFEB8>
>>> Python 2.6.5 (r265:79096, Mar 19 2010, 18:02:59) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> a = 5
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> a
5
>>> a = 6
>>> a
5
>>> a
6
>>> a
5
>>> a
6
>>> a
5
>>> a
6
Run Code Online (Sandbox Code Playgroud)

我第一次打电话a,它是未定义的,即使我在上面的行中定义它.我再次调用它,它是5.然后我将它设置为6,并且每个后续调用在两者之间交替.这似乎正是您所经历的.

stdin是行缓冲,导致交替的文本行传递给交替进程,在这种情况下是两个Python实例.