私のデバッグには、pdb
がかなり良いです。しかし、ipython
に入ることができれば、多くの場合クーラー(と役立つ)でしょう。このことは可能ですか?コードからipythonに入ることは可能ですか?
答えて
あり、標準的なPDBにiPythonを埋め込むipdb
プロジェクトがあるので、あなただけ行うことができます。
import ipdb; ipdb.set_trace()
それはいつものpip install ipdb
経由でインストール可能です。
ipdb
はかなり短いので、代わりにあなたもあなたのPythonパス上のどこかのファイルipdb.py
を作成し、ファイルに次のように貼り付けることができeasy_installingの:
import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi
shell = IPShell(argv=[''])
def set_trace():
ip = ipapi.get()
def_colors = ip.options.colors
Pdb(def_colors).set_trace(sys._getframe().f_back)
通常、ipythonを使用すると、その中の "pdb"コマンドで自動デバッグをオンにします。
私のスクリプトがあるディレクトリで "run myscript.py"コマンドを使ってスクリプトを実行します。
例外が発生した場合、ipythonはデバッガ内でプログラムを停止します。 IPython docsからのコマンドipython魔法(マジック%)
のでipython.set_trace(のようなものを書いている方法はありませんに? :) – Geo
のヘルプコマンドをチェックアウト:
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
がプログラムIPythonシェルを起動します。明らかにnamespace
dictの値はダミー値に過ぎません。実際にはlocals()
を使用する方が意味があります。
これをハードコードする必要があります。 pdb
のように動作しません。それがあなたの望むものなら、DoxaLogosの答えはおそらくあなたが探しているものに似ています。
import pdb; pdb.set_trace()
の同等IPythonは次のようなものです:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
少し冗長ですが、ipdbがインストールされていないかどうかを知っておくとよいでしょう。 make_session
コールは、カラースキームなどを設定するために一度必要とされ、set_trace
コールは、中断する必要がある場所に配置することができます。
簡単高速かつウェイ:あなたはあなたのプログラムのデバッグを開始したいところはどこでも
from IPython.Debugger import Tracer
debug = Tracer()
は、それからちょうど
debug()
を書きます。
'ImportError:Python 3.4/IPython 3の 'IPython.Debugger''という名前のモジュールがありません – ostrokach
IPython 0。11、あなたはあなたのプログラムがこの
In [5]: cat > tmpf.py
a = 1
from IPython import embed
embed() # drop into an IPython session.
# Any variables you define or modify here
# will not affect program execution
c = 2
^D
これは、あなたがそれを実行したときに何が起こるかであるように見えるかもしれません。この
のようにコード内で直接IPythonを埋め込むことができます(私は、任意の既存のipythonセッション内でそれを実行することを選びました。このようにipythonセッションをネストすると、クラッシュする可能性があります)。
In [6]:
In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.
IPython 0.11 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: who
a embed
In [2]: a
Out[2]: 1
In [3]:
Do you really want to exit ([y]/n)? y
In [7]: who
a c embed
これはIPythonセッションに落ちることは非常にクールです。どうもありがとうございます! – joon
これを愚かに(ほぼ無限の)ループの内側に配置しました。どうすれば出ることができますか? – gerrit
@gerrit、あなたがまだそこにいるなら、Ctrl + dを押してください。 – confused00
私は単に私がブレークポイントを設定したい私のスクリプトでこのワンライナーを貼り付けたい:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
新しいバージョンが使用することがあります:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
あなたがしている場合より現代的なバージョンのIPython(> 0.10.2)を使うと、次のようなものを使うことができます。
from IPython.core.debugger import Pdb
Pdb().set_trace()
しかし、おそらくipdbを使うほうが良いでしょう。
最近少し前にモジュールがシャッフルされたようです。 IPython 0.13.1
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
私のために、次の作品では残念ながら、それはすべてのかなりworthless in qtconsoleだけど。
新しいバージョンのIPythonは、IPythonセッションを任意のPythonプログラムに組み込み、ネストするのに簡単なメカニズムを提供します。あなたはIPythonセッションを埋め込むことthe following recipeに従うことができます:
try:
get_ipython
except NameError:
banner=exit_msg=''
else:
banner = '*** Nested interpreter ***'
exit_msg = '*** Back in main IPython ***'
# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
その後、あなたはIPythonシェルにドロップしたいときipshell()
を使用しています。これにより、コードにIPythonインタプリタを埋め込む(そしてネストする)ことができます。
私は数日前にこの回答を追加するとカップルになってしまいました...時々、スクリプトを正常に実行できるようにして、エラー時にipython/ipdbに落とすだけでipdb.set_trace()
ブレークポイント)コード
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(もちろん最初pip install ipython
とpip install ipdb
)
ありがとう!もう少し簡単です: 'ipython --pdb - ./path/to/my/script-with-args here' – alisianoi
- 1. テキストエディタから既存のipythonコンソールにコードを送ることは可能です
- 2. スクリプトから実行中のコードにコードを注入することは可能ですか?
- 3. PythonAnywhereからIPythonノートブックを提供することが可能です
- 4. Geospark:HDFSからデータを入力することは可能です
- 5. JavaScriptコードをPythonでJSファイルに入れることは可能ですか?
- 6. コードをアトミック(C#)にすることは可能ですか?
- 7. Terraformにコードを追加することは可能ですか
- 8. Javaコードをグルーヴィースタイルにすることは可能ですか?
- 9. .net dllをLuaコードからロードすることは可能ですか?
- 10. コード内から衛星アセンブリを生成することは可能ですか?
- 11. UbuntuのPythonコードからEXEファイルをビルドすることは可能ですか?
- 12. レスポンダチェーンにNSObjectControllerを挿入することは可能ですか?
- 13. アートワードをエクセルに挿入することは可能ですか?
- 14. EditTextをLiveWallPaperに入れることは可能ですか?
- 15. リソースファイルをJARファイルに入れることは可能ですか?
- 16. ASP.NET - ユーザーエージェントをオブジェクトに入れることは可能ですか?
- 17. YAML:ルートセクションにリストを入れることは可能ですか?
- 18. ORステートメントをjQueryに入れることは可能ですか
- 19. iframe値をテキストエリアに入れることは可能ですか?
- 20. refを配列に入れることは可能ですか?
- 21. アクティビティを小包に入れることは可能ですか?
- 22. 他のウェブサイトからデータを挿入することは可能ですか?
- 23. TFS 2010ビルドエージェント:tfsプロキシから最新のコードを入手することは可能ですか?
- 24. C++コードを象徴することは可能ですか?
- 25. コード実行ステップをカウントすることは可能ですか?
- 26. キーボード入力からメニューを切り替えることは可能ですか?
- 27. Excel 2007から.NETコードを呼び出すことは可能ですか?
- 28. 挿入前にIDをデータベースに挿入することは可能ですか
- 29. VSコードから影を取り除くことは可能ですか
- 30. コードからアプリケーションを再起動/リセットすることは可能です
恐ろしい!これはとてもクールです! – Geo
Djangoとうまく機能します。まあ、私が入力しているテキストを見ることができないという事実を除いて、それはおそらく簡単に修正可能です(ipdbの6行だけなので)。 –
実際には、Djangoはrunserverのために別のスレッドをforkし、コードを編集するたびにスレッドをrespawnするという問題があります。これは正常に動作しますが、スレッドが強制終了されたときにpdbに座っていると端末が狂ってしまいます。 runserver、runniny 'stty sane'から抜け出し、runserverをやり直すことでこれを修正できます。 –