Điều này sẽ làm gián đoạn quá trình của bạn (trừ khi bạn bắt đầu nó trong một chuỗi), nhưng bạn có thể sử dụng codemô-đun để khởi động bảng điều khiển Python:
import code
code.interact()
Điều này sẽ chặn cho đến khi người dùng thoát khỏi bảng điều khiển tương tác bằng cách thực thi exit().
Các codemô-đun có sẵn trong ít nhất Python v2.6, có lẽ những người khác.
Tôi có xu hướng sử dụng cách tiếp cận này kết hợp với các tín hiệu cho công việc Linux của mình (đối với Windows, xem bên dưới). Tôi nhấn mạnh điều này ở đầu các tập lệnh Python của mình:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
Và sau đó kích hoạt nó từ một vỏ với kill -SIGUSR2 <PID>, nơi <PID>là quá trình ID. Sau đó, quá trình sẽ dừng bất cứ điều gì nó đang làm và trình bày một bảng điều khiển:
Python 2.6.2 (r262:71600, Oct 9 2009, 17:53:52)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Nói chung từ đó tôi sẽ tải thành phần phía máy chủ của trình gỡ lỗi từ xa như WinPDB tuyệt vời .
Windows không phải là hệ điều hành tương thích với POSIX và do đó không cung cấp các tín hiệu tương tự như Linux. Tuy nhiên, Python v2.2 trở lên hiển thị tín hiệu dành riêng cho WindowsSIGBREAK (được kích hoạt bằng cách nhấn CTRL+ Pause/Break). Điều này không ảnh hưởng đến hoạt động CTRL+ C( SIGINT) bình thường và vì vậy là một giải pháp thay thế tiện dụng.
Do đó, một phiên bản di động, nhưng hơi xấu, ở trên là:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
Ưu điểm của phương pháp này:
- Không có mô-đun bên ngoài (tất cả nội dung Python tiêu chuẩn)
- Chỉ tiêu tốn ít tài nguyên cho đến khi được kích hoạt (2 lần nhập)
Đây là mã tôi sử dụng trong môi trường sản xuất của mình, mã này sẽ tải phía máy chủ của WinPDB (nếu có) và quay lại để mở bảng điều khiển Python.
def debug_signal_handler(signal, frame):
del signal
del frame
try:
import rpdb2
print
print
print "Starting embedded RPDB2 debugger. Password is 'foobar'"
print
print
rpdb2.start_embedded_debugger("foobar", True, True)
rpdb2.setbreak(depth=1)
return
except StandardError:
pass
try:
import code
code.interact()
except StandardError as ex:
print "%r, returning to normal program flow" % ex
import signal
try:
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR1"),
debug_signal_handler
)
except ValueError:
pass