2013-09-03 40 views
9

Nếu tôi muốn chạy một kịch bản và có pdb bắt bất kỳ trường hợp ngoại lệ đi lên, tôi gọi nó như vậy:Khi chạy pdb của Python dưới dạng tập lệnh, làm cách nào để tự động khởi chạy tập lệnh?

python -m pdb script.py 

Hoặc:

pdb script.py 

Vấn đề là nó dừng lại tại dấu nhắc gỡ lỗi ngay lập tức:

> /home/coiax/Junkyard/script.py(1)<module>() 
-> import sys 
(Pdb) 

Và tôi phải nhập c hoặc continue để tải xuống. Có cách nào để có được nó chỉ cần tải và bắt đầu kịch bản mà không hỏi ban đầu nếu tôi muốn thiết lập bất kỳ breakpoint hoặc bất cứ điều gì?

Tôi thề tôi đã đọc tài liệu pdb mô-đun, và cố gắng thực hiện một tập tin .pdbrc chứa

c 

nhưng nó không khởi động tự động một cách kỳ diệu.

+3

Các tài liệu cũng nói 'Thay đổi trong phiên bản 3.2: bây giờ .pdbrc có thể chứa các lệnh mà tiếp tục gỡ lỗi, chẳng hạn như tiếp tục hoặc bên cạnh. Trước đây, các lệnh này không có hiệu lực.' Tôi đã thử nó với python 3.3, và nó thực hiện chính xác những gì bạn muốn như đã nêu trong câu hỏi của bạn. Phiên bản python nào bạn đang chạy? – snapshoe

+0

@snapshoe không đủ mới, có xu hướng là 2.7 vì thư viện không di chuyển nhanh đến 3x. Cảm ơn cho rằng mặc dù. :) – coiax

Trả lời

7

gì bạn muốn trivially có thể đạt được bằng ipython:

ipython yourmodule.py --pdb 

Bất cứ khi nào một ngoại lệ xảy ra mà không được bắt đúng (tức là chương trình bị treo), bạn ngay lập tức hạ cánh trong debugger ipython tại điểm mà các ngoại lệ được nuôi dưỡng. Từ đó bạn có thể di chuyển stack lên và xuống, kiểm tra các biến, vv Đây là một trình tiết kiệm thời gian rất lớn khi phát triển với Python; Tôi sử dụng nó mọi lúc.

+0

Khi tôi bắt đầu '' python -m pdb somescript.py'' nó sẽ ngay lập tức khởi động PDB ngay cả khi không có ngoại lệ nào được nâng lên. Tôi nghĩ rằng OP muốn PDB chỉ bật lên khi có điều gì đó sai, đó là những gì '' ipython somescript.py --pdb'' làm. –

+0

Ah, và đây là nơi tôi phát hiện ra tôi đặt chân vào miệng; đó là lỗi tài liệu; ít nhất nó nên đề cập đến rằng gỡ lỗi bắt đầu ngay lập tức, cũng như vào chế độ PM khi bạn tiếp tục một ngoại lệ unhandled. –

1

đó có thể không phải là cách để thực hiện.

bạn nên sửa đổi/mở rộng pdb.py hiện tại. mã trông như thế này:

while True: 
    try: 
     pdb._runscript(mainpyfile) 
     if pdb._user_requested_quit: 
      break 
     print "The program finished and will be restarted" 
    except: 
     traceback.print_exc() 
     print "Uncaught exception. Entering post mortem debugging" 
     print "Running 'cont' or 'step' will restart the program" 
     t = sys.exc_info()[2] 
     pdb.interaction(None, t) 
     print "Post mortem debugger finished. The "+mainpyfile+" will be restarted" 

có vẻ như bạn có thể thay thế `pdb._runscript (mainpyfile) với một cái gì đó giống như

runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True) 

(từ PEP 338).

không phải là giải pháp hoàn chỉnh và tôi chưa thử nghiệm, nhưng có thể giúp ích.

chỉnh sửa: nhưng đối với một giải pháp đơn giản, cho một kịch bản duy nhất, kịch bản của bạn có thể kết thúc với một cái gì đó như:

if __name__ == '__main__': 
    call_main_function() 

bạn chỉ cần thay thế nó nó

if __name__ == '__main__': 
    try: 
     call_main_function() 
    except: 
     import pdb 
     t = sys.exc_info()[2] 
     pdb.interaction(None, t) 

(đang cuối cùng bị đánh cắp từ pdb .py, đó là chính xác những gì nó làm khi nó được một ngoại lệ unhandled).

-2

pdb không có lệnh tạo điều kiện thuận lợi cho bạn. Bạn có thể thử sử dụng một IDE như PyCharm of PyDev. Bạn có thể làm những gì Corley Brigman đề nghị, hoặc bạn có thể đơn giản sử dụng một IDE, điều đó làm cho cuộc sống dễ dàng hơn nhiều.

0

Bạn có nhất định rằng nó không thực sự chạy không? Từ tài liệu

Khi được gọi là tập lệnh, pdb sẽ tự động nhập gỡ lỗi sau khi xử lý nếu chương trình đang được gỡ lỗi thoát bất thường. Sau khi gỡ lỗi sau khi chết (hoặc sau khi thoát bình thường của chương trình), pdb sẽ khởi động lại chương trình. Việc khởi động lại tự động duy trì trạng thái của pdb (chẳng hạn như các điểm ngắt) và trong hầu hết các trường hợp là hữu ích hơn việc bỏ trình gỡ rối khi thoát khỏi chương trình.

nhấn mạnh mỏ.

Khi tôi chạy chương trình của tôi cố gắng tìm ra lý do tại sao nó đã làm điều tương tự (hiển thị dòng đầu tiên của mã), tôi vẫn tiếp tục cố gắng điều khác nhau và cuối cùng tôi nhận thấy dòng này:

Chương trình đã hoàn thành và sẽ được khởi động lại

Nếu chương trình của bạn, trên thực tế, không có ngoại lệ và sau đó khởi động lại, nó sẽ xuất hiện ngay từ đầu chương trình của bạn.

+0

Tôi đã viết một dòng 2 trong khi kịch bản vòng lặp, và chạy nó như OP đề xuất với 'python -m pdb script.py', và tôi * chắc chắn * nó không chạy. – snapshoe

+0

@snapshoe: tất nhiên PDB không đá vào, bởi vì không có ngoại lệ nào được nêu ra. OP không xác định khi nào anh ta * mong đợi pdb bắt đầu truy tìm lại. –

+0

Vâng, anh ấy đã làm-- khi anh ấy phát hành kịch bản: "Vấn đề là nó ngay lập tức đi: ... Có cách nào để tải và bắt đầu tập lệnh mà không hỏi liệu tôi có muốn đặt bất kỳ điểm ngắt nào hay không bất cứ điều gì?" – snapshoe

2

Nó hoạt động chính xác như bạn mô tả và muốn nó hoạt động trong python 3.3-- với ký tự 'c' trong tệp .pdbrc.

Các tài liệu pdb mô-đun nói này đã được bổ sung trong 3.2:

Thay đổi trong phiên bản 3.2: bây giờ .pdbrc có thể chứa các lệnh mà tiếp tục gỡ lỗi, chẳng hạn như tiếp tục hoặc bên cạnh. Trước đây, các lệnh này không có hiệu lực.

2

Kể từ Python 3.2, bạn có thể sử dụng như sau:

python3 -m pdb -c c script.py 
+0

Đây là câu trả lời hay nhất cho Python 3+. Không yêu cầu đặt hành vi mặc định trong '.pdbrc'. – jayelm

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