2009-05-29 29 views
11

Hey Tôi đã tự hỏi ... Tôi đang sử dụng PyDev với nhật thực và tôi thực sự thưởng thức các tính năng sửa lỗi mạnh mẽ, nhưng tôi đã tự hỏi:Chuyển sang chương trình giữa phiên tương tác Python?

Có thể thiết lập một breakpoint trong nhật thực và nhảy vào trình thông dịch python tương tác trong khi thực thi?

Tôi nghĩ đó sẽ là khá tiện dụng;)

chỉnh sửa: Tôi muốn nhấn mạnh rằng mục tiêu của tôi không phải là để nhảy vào một trình gỡ lỗi. pydev/eclipse có một trình gỡ rối tuyệt vời, và tôi có thể nhìn vào điểm truy nguyên và thiết lập các điểm ngắt.

Những gì tôi muốn là để thực hiện một kịch bản và nhảy vào một thông dịch viên python tương tác trong quá trình thực vì vậy tôi có thể làm những việc như ...

  • poke xung quanh
  • kiểm tra các giá trị của điều
  • thao tác biến số
  • tìm ra một số mã trước khi tôi thêm mã vào ứng dụng

Tôi biết bạn có thể làm điều này tất cả Một trình gỡ rối, nhưng tôi có thể làm nhanh hơn trong trình thông dịch tương tác vì tôi có thể thử một cái gì đó, thấy rằng nó không hoạt động và thử cái gì khác mà không cần đưa ứng dụng trở lại điểm thực thi lại mã đó.

+0

Không cần nhấn mạnh - hãy cân nhắc định dạng lại? –

Trả lời

8

Vì vậy, khoảng một năm từ Câu hỏi của OP, PyDev có khả năng này được xây dựng. Tôi không chắc khi tính năng này được giới thiệu, nhưng tất cả những gì tôi biết là tôi đã dành ~ 2 giây Googling cuối cùng ... cấu hình iPython và bất cứ thứ gì (trông giống như nó đã làm công việc), nhưng chỉ để nhận ra Eclipse/PyDev có những gì tôi muốn ootb.

Ngay sau khi bạn nhấn điểm ngắt trong chế độ gỡ lỗi, bảng điều khiển ở ngay đó sẵn sàng và chờ! Tôi chỉ không nhận thấy điều này vì không có con trỏ nhắc hoặc nhấp nháy; Tôi đã giả định sai nó là một tiêu chuẩn, đầu ra chỉ, giao diện điều khiển ... nhưng nó không phải. Nó thậm chí có mã hoàn thành.

Công cụ tuyệt vời, xem http://pydev.org/manual_adv_debug_console.html để biết thêm chi tiết.

+0

wow ... tuyệt vời tìm thấy :) – Jiaaro

+0

Có và bạn thậm chí có thể sử dụng nó trên một ngăn xếp Apache + mod_wsgi (hoặc thiết lập sản xuất khác). Tuy nhiên để đảm bảo giao diện điều khiển tương tác hoạt động tuy nhiên bạn phải khởi chạy nó như vậy: 'từ pydevsrc import pydevd; pydevd.settrace ('', stdoutToServer = True, stderrToServer = True)' –

-2

Nếu bạn đang chạy trong chế độ gỡ lỗi, bạn có thể đặt điểm ngắt bổ sung nếu việc thực thi chương trình hiện bị tạm dừng (ví dụ: vì bạn đã ở điểm ngắt). Tôi đã thử nó ngay bây giờ với Pydev mới nhất - nó hoạt động tốt.

Nếu bạn đang chạy bình thường (tức là không ở chế độ gỡ lỗi) tất cả các điểm ngắt sẽ bị bỏ qua. Không có thay đổi nào đối với điểm ngắt sẽ thay đổi cách hoạt động của chương trình không gỡ lỗi.

2

Tôi đã sử dụng mã này trong số sitecustomize.py của mình để bắt đầu trình gỡ lỗi về ngoại lệ. Điều này cũng có thể được kích hoạt bởi Ctrl + C. Nó hoạt động đẹp trong vỏ, không biết về nhật thực.

import sys 

def info(exception_type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or not sys.stdin.isatty() or not sys.stdout.isatty() or type==SyntaxError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(exception_type, value, tb) 
    else: 
     import traceback 
     import pdb 


     if exception_type != KeyboardInterrupt: 
      try: 
       import growlnotify 
       growlnotify.growlNotify("Script crashed", sticky = False) 
      except ImportError: 
       pass 

     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(exception_type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

Đây là sourcemore discussion on StackOverflow.

2

Bạn có thể tham gia phiên tương tác bằng cách sử dụng code.InteractiveConsole như được mô tả here; tuy nhiên tôi không biết cách kích hoạt điều này từ Eclipse.

Giải pháp có thể là chặn Ctrl + C để nhảy vào bảng điều khiển tương tác này (sử dụng mô-đun signal: signal.signal(signal.SIGINT, my_handler)), nhưng có thể sẽ thay đổi ngữ cảnh thực thi và có thể bạn không muốn điều này.

1

Không thực sự là câu trả lời cho câu hỏi của bạn, nhưng chỉ là một con trỏ tới iPython. Chỉ trong trường hợp bạn không biết về nó. Tôi sử dụng nó side-by-side với eclipse/pydev cho những thứ như vậy.

Mức độ liên quan là thông tin này về cách nhúng iPython vào ứng dụng của riêng bạn. Điều này cung cấp khả năng làm những gì bạn đang tìm kiếm nếu bạn sẵn sàng làm điều đó bên ngoài nhật thực/pydev.

6

Đây là từ một dự án cũ, và tôi đã không viết nó, nhưng nó làm một cái gì đó tương tự như những gì bạn muốn bằng cách sử dụng ipython.

'''Start an IPython shell (for debugging) with current environment.      
Runs Call db() to start a shell, e.g.             


def foo(bar):                   
    for x in bar:                  
     if baz(x):                  
      import ipydb; ipydb.db() # <-- start IPython here, with current value of x (ipydb is the name of this module). 
.                      
''' 
import inspect,IPython 

def db(): 
    '''Start IPython shell with callers environment.''' 
    # find callers                  
    __up_frame = inspect.currentframe().f_back 
    eval('IPython.Shell.IPShellEmbed([])()', # Empty list arg is      
     # ipythons argv later args to dict take precedence, so       
     # f_globals() shadows globals(). Need globals() for IPython     
     # module.                  
     dict(globals().items() + __up_frame.f_globals.items()), 
     __up_frame.f_locals) 

chỉnh sửa bởi Jim Robert (chủ sở hữu câu hỏi): Nếu bạn đặt mã trên vào một tập tin gọi my_debug.py vì lợi ích của ví dụ này. Sau đó, đặt rằng file trong đường dẫn python của bạn, và bạn có thể chèn những dòng sau bất cứ nơi nào trong mã của bạn để nhảy vào một trình gỡ lỗi (miễn là bạn thực hiện từ một vỏ):

import my_debug 
my_debug.db() 
Các vấn đề liên quan