2008-12-02 39 views

Trả lời

10

Một giải pháp làm việc với Python 2.4 (nó sẽ làm việc với bất kỳ phiên bản vượt trội so với 2.1) và Pydev:

import inspect 

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

Cùng nên làm việc với pdb bằng cách đơn giản thay thế pydevd.py với pdb.py. Như do3cc đề xuất, nó cố gắng tìm trình gỡ rối trong ngăn xếp của người gọi.

Liên kết hữu ích:

2

Từ xem nhanh tài liệu pdb và mã nguồn, có vẻ như không có cách nào được tích hợp sẵn để thực hiện việc này. Tôi khuyên bạn nên đặt một biến môi trường cho biết gỡ lỗi đang được tiến hành và ứng dụng của bạn phản hồi điều đó.

$ USING_PDB=1 pdb yourprog.py 

Sau đó, trong yourprog.py:

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

gỡ rối Python (cũng như profilers và các công cụ bảo hiểm) sử dụng sys.settrace chức năng (trong module sys) để đăng ký một callback mà được gọi là khi thú sự kiện xảy ra.

Nếu bạn đang sử dụng Python 2.6, bạn có thể gọi sys.gettrace() để nhận hàm gọi lại theo dõi hiện tại. Nếu nó không phải là None thì bạn có thể giả định rằng bạn nên truyền các tham số gỡ lỗi cho JVM.

Không rõ cách bạn có thể thực hiện việc này trước phiên bản 2.6.

+1

Mặc dù nó có vẻ là một cách sạch, nó không hoạt động trong pdb nếu không có bộ breakpoint. – apoorvkul

+0

Hmm, bạn nói đúng - nó phải là một tối ưu hóa mà trình gỡ lỗi sử dụng. Điều đó nói rằng, hầu hết thời gian khi bạn đang chạy trong trình gỡ lỗi, bạn sẽ có một bộ breakpoint. – babbageclunk

1

Bạn có thể thử xem nhanh trong ngăn xếp của mình.

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

khi bạn cố gắng này trong một phiên gỡ rối:

import inspect 
inspect.getouterframes(inspect.currentframe() 

bạn sẽ nhận được một danh sách các framerecords và có thể peek cho bất kỳ khung tham chiếu đến file pdb.

3

Nếu bạn đang sử dụng Pydev, bạn có thể phát hiện nó theo cách như vậy:

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

Một cách khác để làm nó xoay quanh cách trình thông dịch python của bạn được bắt đầu. Nó yêu cầu bạn bắt đầu sử dụng Python -O để sản xuất và không có -O để gỡ lỗi. Vì vậy, nó đòi hỏi một kỷ luật bên ngoài mà có thể khó duy trì .. nhưng sau đó một lần nữa nó có thể phù hợp với quy trình của bạn một cách hoàn hảo.

Từ các tài liệu python (xem "Built-in hằng" here hoặc here):

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

Cách sử dụng sẽ là một cái gì đó như:

if __debug__: 
    print 'Python started without optimization' 
2

Tôi tìm thấy một cách sạch hơn để làm điều đó,

Chỉ cần thêm dòng sau vào số manage.py

của bạn 210
#!/usr/bin/env python 
import os 
import sys 

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


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

Sau đó, nó sẽ tự động thêm nó khi bạn đang gỡ lỗi.

5

thay thế khác nếu bạn đang sử dụng Pydev mà cũng làm việc trong một đa luồng là:

try: 
    import pydevd 
    DEBUGGING = True 
except ImportError: 
    DEBUGGING = False 
Các vấn đề liên quan