Dừng trăn bằng ctrl + c


128

Tôi có một kịch bản python sử dụng các luồng và thực hiện nhiều yêu cầu HTTP. Tôi nghĩ những gì đang xảy ra là trong khi một yêu cầu HTTP (sử dụng urllib2) đang đọc, nó sẽ chặn và không phản hồi CtrlCđể dừng chương trình. Có cách nào để khắc phục điều này?


9
Tôi không biết tại sao, nhưng ít nhất là trên OS X, sử dụng Control + Backslash khiến nó chấm dứt và bạn nhận được hộp thoại "python crash" ... lạ. Không thực sự là thông tin hữu ích, do đó nó là một bình luận!
micmoo

3
Trên thực tế, nó hoạt động trên tất cả các ứng dụng trong Terminal ...
micmoo

1
David Beazley đã mô tả làm thế nào một ngắt Ctrl / C có thể biến một tập lệnh Python có luồng khác nhau thành một con lợn CPU. Nó chạm vào đây ( stackoverflow.com/questions/990102/ - ) với một liên kết đến bài nói chuyện của Beazley.
Ned Deily

Câu trả lời:


189

Trên Windows, cách chắc chắn duy nhất là sử dụng CtrlBreak. Dừng mọi kịch bản python ngay lập tức!

(Lưu ý rằng trên một số bàn phím, "Break" được gắn nhãn là "Tạm dừng".)


4
Breakgì Làm thế nào để tôi gõ nó?
u0b34a0f6ae

5
Cần có nút Pause_Break trên bàn phím của bạn
jonatron

18
Nếu không có thì sao? Tôi đang dùng Macbook của Intel và nó không có bàn phím đầy đủ tính năng.
Bluu

53
Trên Linux, bạn nên sử dụng Ctrl-Shift- \
Michał Zieliński

12
ctrl + Z không giết tập lệnh, nó chỉ ẩn nó vào nền và tạm dừng nó. Bạn có thể gõ fg để gọi lại nó.
Shady Xu

84

Nhấn Ctrl+ ctrong khi chương trình python đang chạy sẽ khiến python đưa ra một KeyboardInterruptngoại lệ. Có khả năng một chương trình tạo ra nhiều yêu cầu HTTP sẽ có nhiều mã xử lý ngoại lệ. Nếu exceptmột phần của khối try- exceptkhông chỉ định ngoại lệ nào sẽ bắt, nó sẽ bắt tất cả các ngoại lệ bao gồm cả ngoại lệ KeyboardInterruptmà bạn vừa gây ra. Một chương trình python được mã hóa đúng sẽ sử dụng hệ thống phân cấp ngoại lệ của python và chỉ bắt các ngoại lệ có nguồn gốc từ Exception.

#This is the wrong way to do things
try:
  #Some stuff might raise an IO exception
except:
  #Code that ignores errors

#This is the right way to do things
try:
  #Some stuff might raise an IO exception
except Exception:
  #This won't catch KeyboardInterrupt

Nếu bạn không thể thay đổi mã (hoặc cần tắt chương trình để các thay đổi của bạn có hiệu lực) thì bạn có thể thử nhấn Ctrl+ cnhanh chóng. Các KeyboardInterruptngoại lệ đầu tiên sẽ loại chương trình của bạn ra khỏi trykhối và hy vọng một trong những KeyboardInterruptngoại lệ sau sẽ được nêu ra khi chương trình nằm ngoài một trykhối.


1
Đây là một câu trả lời tuyệt vời để cho phép "phá vỡ" phổ biến nhất là ctrl + c.
Xerion

53

Nếu nó đang chạy trong shell Python, hãy sử dụng Ctrl+ Z, nếu không thì xác định vị trí của pythontiến trình và giết nó.


25
^Z-> [1]+ Stopped -> kill %1để dừng công việc # 1 (hoặc công việc% 1 như bash đặt nó)
u0b34a0f6ae

23
Đáng để thêm vào câu trả lời rằng Ctrl + Z chỉ tạm dừng quá trình.
Matteo Italia

2
Để giải thích chi tiết ở trên: Tạm dừng quá trình giữ nó xung quanh trong bộ nhớ và trong vỏ của bạn, nó chỉ ngăn nó sử dụng tài nguyên CPU. Tập tin, ổ cắm, mọi thứ vẫn đang mở và đang sử dụng. Trong thực tế, gõ fgsẽ mang nó trở lại ngay.
RandomInsano

2
Ctrl+Zkhông phải là cách thích hợp để ngăn chặn tập lệnh python và nên tránh trừ khi bạn có kế hoạch tiếp tục quá trình tạm dừng.
Josh Correia

33

Quá trình ngắt phụ thuộc vào phần cứng và hệ điều hành. Vì vậy, bạn sẽ có hành vi rất khác nhau tùy thuộc vào nơi bạn chạy tập lệnh python của bạn. Ví dụ: trên các máy Windows, chúng ta có Ctrl+ C( SIGINT) và Ctrl+ Break(SIGBREAK ).

Vì vậy, trong khi SIGINT có mặt trên tất cả các hệ thống và có thể được xử lý và bắt, tín hiệu SIGBREAK là đặc trưng của Windows (và có thể bị vô hiệu hóa trong CONFIG.SYS ) và thực sự được BIOS xử lý như một vectơ ngắt INT 1Bh , đó là lý do tại sao khóa này mạnh hơn nhiều so với bất kỳ khác. Vì vậy, nếu bạn đang sử dụng một số hệ điều hành có hương vị * nix, bạn sẽ nhận được các kết quả khác nhau tùy thuộc vào việc triển khai, vì tín hiệu đó không xuất hiện ở đó, nhưng các tín hiệu khác thì có. Trong Linux, bạn có thể kiểm tra những tín hiệu nào có sẵn cho bạn bằng cách:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMAX

Vì vậy, nếu bạn muốn bắt CTRL+BREAK tín hiệu trên hệ thống linux, bạn sẽ phải kiểm tra xem tín hiệu POSIX nào họ đã ánh xạ khóa đó. Ánh xạ phổ biến là:

CTRL+\     = SIGQUIT 
CTRL+D     = SIGQUIT
CTRL+C     = SIGINT
CTRL+Z     = SIGTSTOP 
CTRL+BREAK = SIGKILL or SIGTERM or SIGSTOP

Trong thực tế, nhiều chức năng hơn có sẵn trong Linux, nơi SysRq(Hệ thống yêu cầu) quan trọng có thể đảm nhận một cuộc sống của riêng mình ...


19

Bài đăng này đã cũ nhưng gần đây tôi gặp vấn đề tương tự Ctrl+ Ckhông chấm dứt tập lệnh Python trên Linux. Tôi đã sử dụng Ctrl+ \( SIGQUIT).


Mặc dù nó sẽ gây ra lỗi kết xuất cốt lõi, nhưng nó đã dừng kịch bản, cảm ơn
ospider 14/12/17

17

Ctrl+ DSự khác biệt cho Windows và Linux

Hóa ra là từ Python 3.6, trình thông dịch Python xử lý Ctrl+ Ckhác nhau cho Linux và Windows. Đối với Linux, Ctrl+ Csẽ hoạt động chủ yếu như mong đợi tuy nhiên trên Windows Ctrl+ C hầu như không hoạt động, đặc biệt nếu Python đang chạy cuộc gọi chặn như thread.joinhoặc chờ phản hồi trên web. Nó làm việc cho time.sleep, tuy nhiên. Đây là lời giải thích hay về những gì đang diễn ra trong trình thông dịch Python. Lưu ý rằng Ctrl+ Ctạo SIGINT.

Giải pháp 1: Sử dụng Ctrl+ Breakhoặc tương đương

Sử dụng các phím tắt bên dưới trong cửa sổ terminal / console sẽ tạo SIGBREAKở mức thấp hơn trong HĐH và chấm dứt trình thông dịch Python.

Hệ điều hành Mac và Linux

Ctrl+ Shift+ \hoặc Ctrl+\

Windows :

  • Chung: Ctrl+Break
  • Dell: Ctrl+ Fn+ F6hoặc Ctrl+ Fn+S
  • Lenovo: Ctrl+ Fn+ F11hoặc Ctrl+ Fn+B
  • HP: Ctrl+ Fn+Shift
  • Samsung: Fn+Esc

Giải pháp 2: Sử dụng API Windows

Dưới đây là các chức năng tiện dụng sẽ phát hiện Windows và cài đặt trình xử lý tùy chỉnh cho Ctrl+ Ctrong bảng điều khiển:

#win_ctrl_c.py

import sys

def handler(a,b=None):
    sys.exit(1)
def install_handler():
    if sys.platform == "win32":
        import win32api
        win32api.SetConsoleCtrlHandler(handler, True)

Bạn có thể sử dụng ở trên như thế này:

import threading
import time
import win_ctrl_c

# do something that will block
def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()

#install handler
install_handler()

# now block
t.join()

#Ctrl+C works now!

Giải pháp 3: Phương pháp bỏ phiếu

Tôi không thích hoặc đề xuất phương pháp này vì nó không cần thiết tiêu thụ bộ xử lý và sức mạnh ảnh hưởng tiêu cực đến hiệu suất.

nhập luồng thời gian nhập

def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
    t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception

Không, trên Ubuntu, đối với cả python 2.7 và 3.6, nhấn ctrl + ckhông thoát mà hiển thị KeyboardInterrupt.
Rick

7

Trên máy Mac, nhấn Ctrl+ \để thoát quy trình python được gắn vào thiết bị đầu cuối.


3

Trên mac / trong Terminal:

  1. Show Inspector (nhấp chuột phải trong cửa sổ terminal hoặc Shell> Show Inspector)
  2. nhấp vào biểu tượng Cài đặt ở trên "quy trình đang chạy"
  3. chọn từ danh sách các tùy chọn trong "Nhóm xử lý tín hiệu" (Giết, chấm dứt, ngắt, v.v.).

1
  • Buộc chương trình phải đóng bằng Alt + F4 (tắt chương trình hiện tại)
  • Gửi thư rác cho nút X trên CMD cho ex
  • TASkmanager (đầu tiên là Windows + R và sau đó là "taskmgr") và sau đó kết thúc nhiệm vụ.

Những người có thể giúp đỡ.


1

Bạn có thể mở trình quản lý tác vụ của mình (ctrl + alt + xóa, sau đó chuyển đến trình quản lý tác vụ) và xem qua python và máy chủ được gọi (ví dụ) _go_app (quy ước đặt tên là: _lingu_app).

Nếu tôi kết thúc tác vụ _go_app, nó sẽ kết thúc máy chủ, do đó, trong trình duyệt sẽ báo nó "kết thúc bất ngờ", tôi cũng sử dụng git bash và khi tôi khởi động máy chủ, tôi không thể thoát khỏi máy chủ trong vỏ bash với ctrl + c hoặc ctrl + tạm dừng, nhưng khi bạn kết thúc tác vụ python (tác vụ sử dụng 63,7 mb), nó sẽ thoát khỏi tập lệnh máy chủ trong bash và cho phép tôi sử dụng shell git bash. nhập mô tả hình ảnh ở đây


1

Đối với bản ghi, thứ đã giết quá trình trên Raspberry 3B + của tôi (chạy raspbian) là Ctrl+ '. Trên bàn phím AZERTY của tôi, cảm ứng 'cũng là số 4.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.