web-dev-qa-db-ja.com

Pythonのデバッグのヒント

Pythonをデバッグするための最良のヒントは何ですか?

実際にできることを言わずに特定のデバッガをリストしないでください。

関連する

164
Casebash

PDB

Pdbモジュールを使用して、どこにでもpdb.set_trace()を挿入することができ、それはブレークポイントとして機能します。

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

実行を継続するには、c(またはcontまたはcontinue)を使用します。

Pdbを使って任意のPython式を実行することが可能です。たとえば、間違いを見つけた場合は、コードを修正してから、式を入力して実行中のコードで同じ効果を得ることができます。

ipdbは IPython のpdbのバージョンです。それはタブ補完を含むすべてのIPython機能でpdbの使用を可能にします。

キャッチされていない例外に対して pdbを自動的に実行するように設定する することも可能です。

Pydb はPdbの拡張版になるように書かれています。利点?

139
ghostdog74

http://pypi.python.org/pypi/pudb 、フルスクリーンのコンソールベースのPythonデバッガ。

その目的は、より軽量でキーボードに優しいパッケージで、最新のGUIベースのデバッガの優れた機能をすべて提供することです。 PuDBを使用すると、端末でコードを記述してテストする場所でコードをデバッグできます。 DOSベースの優れた(しかし最近では)DOSベースのTurbo PascalまたはCツールを使用したことがあれば、PuDBのUIは見慣れたものになるでしょう。

pudb screenshot

スタンドアロンスクリプトをデバッグするのに便利です。

python -m pudb.run my-script.py
78
miku

Pdbを使用している場合は、ショートカットのエイリアスを定義できます。私はこれらを使います:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d
40
Ned Batchelder

ロギング

Pythonはすでに優れた 組み込みロギングモジュール を持っています。あなたは ここでロギングテンプレート を使いたいかもしれません。

Loggingモジュールでは重要度を指定できます。デバッグ中はすべてをログに記録できますが、通常の操作では重要なものだけをログに記録できます。あなたは物事をオン/オフに切り替えることができます。

ほとんどの人は基本的なprint文を使ってデバッグし、その後print文を削除します。それらを入れたままにして、無効にすることをお勧めします。その後、別のバグがある場合は、すべてを再度有効にしてログを確認できます。

これは、ネットワーク接続のもう一方の端がタイムアウトして消える前に応答する必要があるネットワーキングプログラムなど、迅速に対処する必要があるプログラムをデバッグするための最善の方法です。あなたはデバッガをシングルステップする時間があまりないかもしれません。しかし、コードを実行してすべてをログに記録し、次にログを調べて実際に何が起こっているのかを把握することができます。

編集:テンプレートの元のURLは次のとおりです。 http://aymanh.com/python-debugging-techniques

このページがないので、archive.orgに保存したスナップショットへの参照に置き換えました。 http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-テクニック

それが再び消えた場合、これが私が述べたテンプレートです。これはブログから取ったコードです。書きませんでした。

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __== '__main__':
  main()

そしてこれが彼の上記の使い方の説明です。繰り返しになりますが、私はこれについての評価を得ていません。


デフォルトでは、loggingモジュールはクリティカル、エラー、警告メッセージを表示します。すべてのレベルが印刷されるようにこれを変更するには、次のようにします。

$ ./your-program.py --logging=debug

ログメッセージをdebug.logというファイルに送信するには、次のようにします。

$ ./your-program.py --logging-level=debug --logging-file=debug.log

33
steveha

Pythonの行が実行される (Thanks Geo!)のようなものを表示することは可能です。これには任意の数のアプリケーションがあります。たとえば、特定の関数がいつ呼び出されるかを確認するためにそれを修正したり、##のようなものを追加して特定の行だけを追跡させることができます。

code.interactは対話型コンソールにあなたを連れて行きます

import code; code.interact(local=locals())

コンソールの履歴に簡単にアクセスできるようにしたい場合は、「 シェルのような履歴メカニズムを持つことができますか? 」を参照してください。

オートコンプリートは インタプリタ に対して有効にできます。

20
Casebash

ipdbはpdbのようなもので、ipythonの素晴らしさを備えています。

19
Alex Gaynor

printステートメント

  • 簡単に無効にするためにprintの代わりにdebug_print関数を推奨する人もいます
  • pprintモジュールは複雑な構造体にとって非常に貴重です。
17
hasen

スクリプトをデバッグするための明らかな方法

python -m pdb script.py
  • そのスクリプトが例外を発生させるときに役立ちます
  • virtualenvを使用してpdbコマンドがvenvs pythonバージョンで実行されていない場合に役立ちます。

そのスクリプトが正確にどこにあるのかわからない場合

python -m pdb ``which <python-script-name>``
16
vinilios

PyDev

PyDev はかなり良いインタラクティブデバッガを持っています。これには、ウォッチ式、評価への移動、スレッドおよびスタックの一覧表示、そして現代のビジュアルデバッガに期待される(ほとんど)通常のすべての機能があります。実行中のプロセスにアタッチしてリモートデバッグを実行することもできます。

ただし、他のビジュアルデバッガと同様に、単純な問題、または他のすべてのことを試した後では非常に複雑な問題に便利です。私はいまだに伐採による重い作業のほとんどを行っています。

15
itsadok

あなたがVisual Studioに慣れているなら、 Visual Studio用のPythonツール があなたが探しているものです。

enter image description here

15
coordinate

Winpdb 非常にいいです、そしてその名前に反してそれは完全にクロスプラットフォームです。

とても素敵なプロンプトベースののGUIデバッガを持っていて、リモートデバッグをサポートしています。

12
orip

Vimでは、これら3つのバインディングがあります。

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2はリモートPythonデバッガで、WinPDB(堅実なグラフィカルデバッガ)と共に使用できます。私はあなたが尋ねることを知っているので、それは私がグラフィカルなデバッガがすることを期待するすべてをすることができます:)

私はnose.toolsからpdbを使って、単体テストと通常のコードをデバッグできるようにします。

最後に、F7マッピングはトレースバックを出力します(例外がスタックの最上部にバブルしたときに得られる種類と同様です)。私はそれが数回以上本当に役に立つとわかりました。

7
David Wolever

あなたのクラスに便利なrepr()メソッドを定義し(オブジェクトが何であるかがわかるように)、repr()や "%r"%(...)や "... {0!デバッグメッセージ/ログのformat(...)は効率的なデバッグの鍵です。

また、他の回答で言及されているデバッガはrepr()メソッドを利用するでしょう。

4
Jacek Konieczny

実行中のPythonアプリケーションからスタックトレースを取得する

いくつかのトリックがあります ここ 。これらは含まれています

  • シグナルを送信してインタープリターに割り込む/スタックトレースを印刷する
  • 未準備のPythonプロセスからスタックトレースを取得する
  • デバッグに役立つようにフラグを付けてインタプリタを実行する
2
Casebash

デバッガに時間を費やさないのであれば(そしてpdbコマンドラインインタフェースの使い勝手が悪いのであれば)、実行をダンプ してトレース して分析することができます。後でそれ。例えば:

python -m trace -t setup.py install > execution.log

これはsetup.py install実行のすべてのソース行をexecution.logにダンプします。

トレースの出力をカスタマイズしたり独自のトレーサを書いたりするのを簡単にするために、いくつかのコードを xtrace モジュール(パブリックドメイン)にまとめました。

2

UdacityのAndreas Zellerによる「 Software Debugging 」という完全なオンラインコースがあり、デバッグに関するヒントが満載です。

コース概要

このクラスでは、プログラムを体系的にデバッグする方法、デバッグプロセスを自動化する方法、およびPythonでいくつかの自動デバッグツールを構築する方法を学びます。

なぜこのコースを受講するのですか?

このコースの終わりには、体系的なデバッグについてしっかりと理解し、デバッグを自動化する方法を知って、そしてPythonでいくつかの機能的なデバッグツールを構築するでしょう。

前提条件と要件

Udacity CS101以上のレベルのプログラミングおよびPythonの基礎知識が必要です。オブジェクト指向プログラミングの基本的な理解は役に立ちます。

強くお勧めします。

1
Udi

可能であれば、ソースレベルのデバッグのためにemacsのM-x pdbを使ってデバッグします。

1
themis

あなたが読みやすい方法であなたのコールスタックを印刷するための素晴らしいグラフィカルな方法が欲しいなら、このユーティリティをチェックしてください: https://github.com/joerick/pyinstrument

コマンドラインから実行します。

python -m pyinstrument myscript.py [args...]

モジュールとして実行します。

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

Djangoを使って実行します。

pyinstrument.middleware.ProfilerMiddlewareMIDDLEWARE_CLASSESを追加してから、リクエストURLの末尾に?profileを追加してプロファイラを有効にするだけです。

0
Hutch