2008-12-02 3 views

Antwort

10

Eine Lösung mit Python arbeitet 2.4 (es sollte überlegen 2.1 mit jeder Version arbeiten) und Pydev:

import inspect 

def isdebugging(): 
    for frame in inspect.stack(): 
    if frame[1].endswith("pydevd.py"): 
     return True 
    return False 

Das gleiche mit pdb durch einfaches Austauschen pydevd.py mit pdb.py funktionieren soll. Wie von do3cc vorgeschlagen, versucht es den Debugger im Stack des Aufrufers zu finden.

Nützliche Links:

2

Von einem kurzen Blick auf die PDC-Dokumente und den Quellcode sieht es nicht so aus, als ob es eine eingebaute Möglichkeit dafür gibt. Ich schlage vor, dass Sie eine Umgebungsvariable setzen, die anzeigt, dass das Debugging läuft und Ihre Anwendung darauf reagiert.

$ USING_PDB=1 pdb yourprog.py 

Dann in yourprog.py:

import os 
if os.environ.get('USING_PDB'): 
    # debugging actions 
    pass 
17

Python-Debugger (sowie Profilern und Coverage Tools) verwenden, um die sys.settrace Funktion (im sys Modul) einen Rückruf zu registrieren, die interessant aufgerufen werden, wenn Ereignisse passieren. Wenn Sie Python 2.6 verwenden, können Sie sys.gettrace() anrufen, um die aktuelle Trace-Callback-Funktion zu erhalten. Wenn es nicht None ist, dann können Sie davon ausgehen, dass Sie Debug-Parameter an die JVM übergeben sollten.

Es ist nicht klar, wie Sie dies vor 2.6 tun könnten.

+1

Obwohl es scheint ein sauberer Weg zu sein, ist es nicht in pdb funktioniert, wenn kein Haltepunkt gesetzt ist. – apoorvkul

+0

Hmm, du hast recht - es muss eine Optimierung sein, die der Debugger benutzt. Das heißt, die meiste Zeit, wenn Sie im Debugger laufen, haben Sie einen Breakpoint gesetzt. – babbageclunk

1

Sie können versuchen, einen Blick in Ihren Stacktrace zu werfen.

https://docs.python.org/library/inspect.html#the-interpreter-stack

wenn Sie versuchen, dies in einer Debugger-Sitzung:

import inspect 
inspect.getouterframes(inspect.currentframe() 

Sie eine Liste von framerecords zu bekommen und für alle Frames können, die auf die PDB-Datei verweisen spähen.

3

Wenn Sie Pydev verwenden, können Sie es in einer solchen Art und Weise erkennen:

import sys 
if 'pydevd' in sys.modules: 
    print "Debugger" 
else: 
    print "commandline" 
5

Eine weitere Möglichkeit, zu tun Es hängt davon ab, wie Ihr Python-Interpreter gestartet wird. Sie müssen Python mit -O für die Produktion und ohne -O für das Debuggen starten. Es erfordert also eine externe Disziplin, die schwer zu pflegen ist. Aber dann könnte es auch perfekt zu Ihren Prozessen passen.

Aus der Python-Dokumentation (siehe "Built-in Constants" here oder here):

__debug__ 
This constant is true if Python was not started with an -O option. 

Verwendung so etwas wie sein würde:

if __debug__: 
    print 'Python started without optimization' 
2

ich eine saubere Art und Weise, es zu tun gefunden,

fügen Sie einfach die folgende Zeile in Ihrem manage.py

#!/usr/bin/env python 
import os 
import sys 

if __debug__: 
    sys.path.append('/path/to/views.py') 


if __name__ == "__main__": 
    .... 

Dann würde es automatisch hinzufügen, wenn Sie Debuggen.

5

Andere Alternative, wenn Sie Pydev verwenden, die auch in einem Multi-Threading arbeitet, ist:

try: 
    import pydevd 
    DEBUGGING = True 
except ImportError: 
    DEBUGGING = False 
Verwandte Themen