19

私には、理解できないために説明できない非常に奇妙な動作があるので、ここの誰かが私を助けてくれることを願っています. 私が最初に気付いたのは、ipdb が変数を定義させてくれないことでした。

ipdb> what=5
ipdb> what
*** NameError: name 'what' is not defined
whatelse=6

そして少し後に、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

私には、これは 2 つのインターリーブ デバッグ セッションがあり、奇妙な交互パターンでアクセスできるように見えます。どうすればそれを取り除くことができますか?

編集: すべての python プロセスを強制終了し、コードを再実行すると効果がありました。すべてが正常に戻りました。しかし、何が起こっているのか理解できないので、何が起こったのかに対する答えと、その動作を再現する方法に非常に興味があります.

4

1 に答える 1

10

それぞれが を消費する 2 つのプロセスがある場合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

を初めて呼び出したときa、上記の行で定義したにもかかわらず、未定義でした。もう一度呼び出すと 5 になります。次に 6 に設定し、その後の呼び出しでは 2 つが交互に行われます。これはまさにあなたが経験していることのようです。

stdinは行バッファリングであり、テキストの交互の行が交互のプロセス (この場合は Python の 2 つのインスタンス) に渡されます。

于 2014-01-29T01:11:34.613 に答える