2010-07-22 38 views
8

Tôi muốn sử dụng khả năng nội suy của python để gỡ lỗi/phát triển, nhưng không thể tìm thấy công cụ thích hợp cho việc này.Cách tốt nhất để gỡ lỗi tương tác trong python là gì?

Tôi cần phải nhập vào trình bao (ví dụ IPython) tại vị trí cụ thể hoặc tại sự kiện cụ thể (như ngoại lệ), với người dân địa phương và hình cầu của vỏ được đặt thành khung hình.

My nhanh chóng Hack riêng để minh họa cho nó:

import inspect 
from IPython.Shell import IPShellEmbed 
def run_debug(): 
    stack = inspect.stack() 
    frame = stack[1][0] 
    loc = frame.f_locals 
    glob = frame.f_globals 
    shell = IPShellEmbed() 
    shell(local_ns=loc, global_ns=glob) 

Với theo run_debug() cuộc gọi từ 'breakpoint' hoặc thử/trừ. Nhưng, rõ ràng, điều này cần rất nhiều đánh bóng, đặc biệt để làm việc với các ứng dụng luồng đúng cách.

winpdb có điểm ngắt với bảng điều khiển, nhưng tôi không tìm thấy cách nào để nhanh chóng chạy vỏ python thích hợp từ nó và eval()/exec() không tiện dụng cho việc gỡ lỗi dài.

Trả lời

2

Vì mục đích cá nhân/giáo dục, bạn có thể sử dụng WingIDE - chúng có một số khả năng gỡ lỗi khá vững chắc.

Tất nhiên nếu bạn chỉ lo lắng về việc thay đổi giá trị, bạn luôn có thể sử dụng raw_input() - nhưng điều đó có thể không đủ nâng cao cho nhu cầu của bạn.

+0

Cảm ơn, phiên bản Pro của họ thực sự có chức năng cần thiết và nó tạm dừng quá trình thực thi trước khi chạy vỏ, vì vậy luồng không phải là vấn đề. Khá buồn độc quyền của nó, nhưng có vẻ như trường hợp của nó nhận được những gì bạn đang trả tiền cho. –

+0

Tôi đoán đó là một trong những lợi ích để tính phí - họ có thể đủ khả năng để thuê người và * trả * cho họ để giải quyết các vấn đề như vậy;) Tất nhiên nếu quá đắt tiền, bạn luôn có thể tìm kiếm một hội nghị trăn địa phương và đề nghị họ hỏi Cánh cho một số bản sao cho đi. Họ đã cho chúng tôi 3-4 mỗi năm mà chúng tôi đã hỏi, và mọi giao dịch khác mà tôi đã nghe với họ đều rất ấn tượng. –

0

PyScripter (FOSS) đã một trình gỡ lỗi khá tốt trong xây dựng.

0

Nếu bạn chạy mã của bạn từ ipython và nhấn một ngoại lệ, bạn có thể gọi% debug sau đó để thả vào một pdb ở ngoại lệ. Điều này sẽ cung cấp cho bạn những gì bạn muốn. Hoặc nếu bạn chạy ipython -pdb, bạn sẽ tự động bị rơi vào pdb khi một ngoại lệ chưa được thực hiện xảy ra.

3

Tương tự như những gì bạn đã làm, có ipdb. Có hiệu quả, đó là pdb với shell của ipython (tức là hoàn thành tab, tất cả các chức năng ma thuật khác nhau, v.v.).

Nó thực sự làm chính xác những gì mã nhỏ bạn đã đăng trong câu hỏi của bạn, nhưng kết thúc nó thành một cuộc gọi "ipdb.set_trace()" đơn giản.

+1

Có, đó là hầu như những gì tôi cần, nhưng nó không chơi tốt với các chủ đề, như ví dụ của riêng tôi. Khi tôi gọi nó từ một trong các chủ đề con, những cái khác vẫn đang chạy, thay đổi dữ liệu, gửi tin nhắn đến chuỗi bị dừng, và giữ dữ liệu xuất ra bàn điều khiển. –

Các vấn đề liên quan