Ctrl + c का उपयोग करके अजगर को रोकना


128

मेरे पास एक पायथन स्क्रिप्ट है जो थ्रेड्स का उपयोग करती है और बहुत सारे HTTP अनुरोध करती है। मुझे लगता है कि क्या हो रहा है, जबकि एक HTTP अनुरोध (urllib2 का उपयोग कर रहा है) पढ़ रहा है, यह CtrlCप्रोग्राम को रोकने के लिए अवरुद्ध और जवाब नहीं दे रहा है। क्या इसके आसपास कोई रास्ता है?


9
मुझे नहीं पता कि क्यों, लेकिन कम से कम ओएस एक्स पर, कंट्रोल + बैकस्लैश का उपयोग करने से यह समाप्त हो जाता है और आपको "अजीब दुर्घटनाग्रस्त" संवाद मिलता है ... अजीब है। वास्तव में यह उपयोगी जानकारी नहीं है, इस प्रकार यह एक टिप्पणी है!
माइक्रो

3
वास्तव में यह टर्मिनल में सभी अनुप्रयोगों पर काम करता है ...
micmoo

1
डेविड बेज़ले ने वर्णन किया है कि कैसे एक Ctrl / C रुकावट एक मुली-थ्रेडेड पायथन स्क्रिप्ट को CPU हॉग में बदल सकता है। यह बेज़ले की बात की कड़ी के साथ यहां ( stackoverflow.com/questions/990102/… ) पर छुआ गया है ।
नेड डिली

जवाबों:


189

विंडोज पर, उपयोग करने का एकमात्र निश्चित तरीका है CtrlBreak। हर अजगर लिपि को तुरन्त बंद कर देता है!

(ध्यान दें कि कुछ कीबोर्ड पर, "ब्रेक" को "पॉज़" के रूप में लेबल किया गया है।)


4
क्या है Break? मैं इसे कैसे टाइप करूं?
u0b34a0f6ae

5
आपके कीबोर्ड पर Pause_Break बटन होना चाहिए
jonatron

18
क्या होगा अगर वहाँ नहीं है? मैं एक इंटेल मैकबुक पर हूं, और इसमें बहुत ही पूर्ण-फ़ीचर्ड कीबोर्ड नहीं है।
ब्लू सिप

53
लिनक्स पर आपको
Michaiel Zieli Augski

12
ctrl + Z स्क्रिप्ट को नहीं मारता है, यह सिर्फ पृष्ठभूमि को छुपाता है और इसे निलंबित करता है। आप इसे वापस बुलाने के लिए fg टाइप कर सकते हैं।
शेडी जू

84

एक अजगर कार्यक्रम चल रहा है, जबकि दबाने Ctrl+ cएक KeyboardInterruptअपवाद को बढ़ाने के लिए अजगर का कारण होगा । यह संभावना है कि बहुत सारे HTTP अनुरोध करने वाले प्रोग्राम में बहुत सारे अपवाद हैंडलिंग कोड होंगे। यदि exceptका हिस्सा try- exceptब्लॉक जो अपवाद उसे पकड़ने चाहिए निर्दिष्ट नहीं है, यह सब अपवाद सहित पकड़ेगा KeyboardInterruptहै कि आप बस का कारण बना। एक ठीक से कोडित अजगर कार्यक्रम अजगर अपवाद पदानुक्रम का उपयोग करेगा और केवल अपवाद हैं जो से प्राप्त होता है 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

आप कोड (या कार्यक्रम ताकि आपके परिवर्तन लागू होंगे मारने के लिए की जरूरत है) को बदल नहीं सकते हैं तो आप दबाने की कोशिश कर सकते Ctrl+ cतेजी से। KeyboardInterruptअपवादों में से पहला आपके प्रोग्राम को tryब्लॉक से बाहर कर देगा और उम्मीद है कि बाद के KeyboardInterruptअपवादों में से एक को उठाया जाएगा जब प्रोग्राम एक tryब्लॉक के बाहर हो ।


1
यह सबसे आम "ब्रेक" को सक्षम करने के लिए एक शानदार उत्तर है जो कि ctrl + c है।
ज़ेरियन

53

यदि यह पायथन शेल उपयोग Ctrl+ में चल रहा है Z, अन्यथा pythonप्रक्रिया का पता लगाएं और इसे मार दें।


25
^Z-> [1]+ Stopped -> kill %1नौकरी रोकने के लिए # 1 (या नौकरी% 1 के रूप में मार डालता है)
u0b34a0f6ae

23
इस जवाब को जोड़ने के लायक है कि Ctrl + Z प्रक्रिया को रोक देता है।
मट्टियो इटालिया

2
उपरोक्त को विस्तृत करने के लिए: प्रक्रिया को रोकना स्मृति में और आपके खोल में इसे चारों ओर रखता है, यह सिर्फ सीपीयू संसाधनों का उपयोग करने से रोकता है। फाइलें, सॉकेट, सब कुछ अभी भी खुला है और उपयोग में है। वास्तव में, टाइपिंग fgइसे सही वापस लाएगा।
रैंडमइन्सानो

2
Ctrl+Zपाइथन लिपि को रोकने का उचित तरीका नहीं है और जब तक आप रुकी हुई प्रक्रिया को फिर से शुरू नहीं करते हैं, तब तक इससे बचना चाहिए।
जोश कोर्रेया

33

बाधा प्रक्रिया हार्डवेयर और ओएस पर निर्भर है। इसलिए आपके पास बहुत अलग व्यवहार होगा जहां आप अपनी पाइथन स्क्रिप्ट चलाते हैं। उदाहरण के लिए, विंडोज मशीनों पर हमारे पास Ctrl+ C( SIGINT) और Ctrl+ Break( SIGBREAK) है।

इसलिए जबकि SIGINT सभी प्रणालियों पर मौजूद है और इसे संभाला और पकड़ा जा सकता है, SIGBREAK सिग्नल Windows विशिष्ट है (और CONFIG.SYS में अक्षम किया जा सकता है ) और वास्तव में BIOS द्वारा एक बाधा वेक्टर INT 1Bh के रूप में संभाला जाता है , यही कारण है कि यह कुंजी है किसी भी अन्य की तुलना में बहुत अधिक शक्तिशाली है। इसलिए यदि आप कुछ * निक्स स्वाद वाले ओएस का उपयोग कर रहे हैं, तो आपको कार्यान्वयन के आधार पर अलग-अलग परिणाम मिलेंगे, क्योंकि यह संकेत वहां मौजूद नहीं है, लेकिन अन्य हैं। लिनक्स में आप देख सकते हैं कि आपके लिए कौन से संकेत उपलब्ध हैं:

$ 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

तो अगर आप को पकड़ने के लिए चाहते हैं CTRL+BREAK एक Linux सिस्टम पर सिग्नल उस POSIX सिग्नल की जाँच करनी होगी कि उन्होंने उस कुंजी को मैप किया है। लोकप्रिय मैपिंग हैं:

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

वास्तव में, लिनक्स के तहत कई और कार्य उपलब्ध हैं, जहाँ SysRqसिस्टम (सिस्टम रिक्वेस्ट) कुंजी ले सकता है अपने जीवन को अपना सकती है ...


19

यह पोस्ट पुरानी है, लेकिन मैं हाल ही में लिनक्स पर पायथन स्क्रिप्ट को समाप्त नहीं करने की Ctrl+ उसी समस्या में भाग गया C। मैंने Ctrl+ \( SIGQUIT) का उपयोग किया ।


यद्यपि यह एक कोर डंप का कारण होगा, लेकिन इसने स्क्रिप्ट को रोक दिया, धन्यवाद
ospider

17

CtrlDविंडोज और लिनक्स के लिए + अंतर

ऐसा लगता है कि अजगर 3.6, अजगर के रूप में हैंडल दुभाषिया Ctrl+ Cअलग ढंग से लिनक्स और विंडोज के लिए। लिनक्स के लिए, Ctrl+ विंडोज पर ज्यादातर उम्मीद के Cमुताबिक काम करेगा + ज्यादातर काम नहीं करता है, खासकर अगर पायथन अवरुद्ध कॉल को चला रहा है जैसे कि या वेब प्रतिक्रिया पर प्रतीक्षा कर रहा है। हालांकि, यह काम करता है । यहाँ पायथन दुभाषिया में क्या चल रहा है की अच्छी व्याख्या है। ध्यान दें कि + उत्पन्न करता है ।CtrlC thread.jointime.sleepCtrlCSIGINT

समाधान 1: उपयोग Ctrl+ Breakया समतुल्य

टर्मिनल / कंसोल विंडो में कीबोर्ड शॉर्टकट का उपयोग करें जो SIGBREAKओएस में निचले स्तर पर उत्पन्न होगा और पायथन इंटरप्रिटर को समाप्त करेगा।

मैक ओएस और लिनक्स

Ctrl+ Shift+ \या Ctrl+\

विंडोज :

  • सामान्य: Ctrl+Break
  • डेल: Ctrl+ Fn+ F6या Ctrl+ Fn+S
  • लेनोवो: Ctrl+ Fn+ F11या Ctrl+ Fn+B
  • एचपी: Ctrl+ Fn+Shift
  • सैमसंग: Fn+Esc

समाधान 2: Windows API का उपयोग करें

नीचे आसान कार्य हैं जो विंडोज का पता लगाएंगे और कंसोल में Ctrl+ के लिए कस्टम हैंडलर स्थापित करेंगे C:

#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)

आप इस तरह से ऊपर का उपयोग कर सकते हैं:

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!

समाधान 3: मतदान विधि

मैं इस पद्धति को पसंद नहीं करता या इसकी सिफारिश नहीं करता क्योंकि यह अनावश्यक रूप से प्रोसेसर और पावर को नकारात्मक रूप से प्रभावित करता है और प्रदर्शन को प्रभावित करता है।

आयात सूत्रण आयात समय

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

नहीं, उबंटू पर, अजगर 2.7 और 3.6 दोनों के लिए, दबाने पर ctrl + cभी नहीं दिखा रहा है KeyboardInterrupt
रिक

7

एक टर्मिनल से जुड़ी एक अजगर प्रक्रिया को छोड़ने के लिए मैक प्रेस Ctrl+ \पर।


3

एक मैक में / टर्मिनल में:

  1. इंस्पेक्टर (टर्मिनल विंडो या शेल> इंस्पेक्टर के भीतर राइट क्लिक करें)
  2. "रनिंग प्रोसेस" के ऊपर सेटिंग आइकन पर क्लिक करें
  3. "सिग्नल प्रोसेस ग्रुप" के तहत विकल्पों की सूची में से चुनें (मारें, समाप्त करें, बाधित करें, आदि)।

1
  • Alt + F4 का उपयोग करके प्रोग्राम को बंद करने के लिए मजबूर करना (वर्तमान प्रोग्राम को बंद कर देता है)
  • पूर्व के लिए CMD पर एक्स बटन स्पैमिंग
  • Taskmanager (पहले Windows + R और फिर "taskmgr") और फिर कार्य समाप्त करें।

वे मदद कर सकते हैं।


1

आप अपना कार्य प्रबंधक खोल सकते हैं (ctrl + alt + delete, फिर कार्य प्रबंधक पर जाएं) और इसके माध्यम से अजगर को देखें और सर्वर को कहा जाता है (उदाहरण के लिए) _go_app (नामकरण सम्मेलन है: _language.app)

अगर मैं _go_app कार्य को समाप्त करता हूं, तो यह सर्वर को समाप्त कर देगा, इसलिए ब्राउज़र में वहां जाने पर यह "अनपेक्षित रूप से समाप्त हो जाएगा", मैं गिट बैश का भी उपयोग करता हूं, और जब मैं सर्वर शुरू करता हूं, तो मैं सर्वर को बैश के खोल में तोड़ नहीं सकता ctrl + c या ctrl + pause के साथ, लेकिन एक बार जब आप अजगर कार्य (63.7 mb का उपयोग करने वाला) को समाप्त कर देते हैं, तो यह सर्वर स्क्रिप्ट को bash में तोड़ देगा, और मुझे git bash शेल का उपयोग करने की अनुमति देगा। यहाँ छवि विवरण दर्ज करें


1

रिकॉर्ड के लिए, मेरे रास्पबेरी 3 बी + (रनिंग रास्पियन) पर प्रक्रिया को किसने मारा Ctrl+ '। मेरे फ्रांसीसी AZERTY कीबोर्ड पर, स्पर्श 'नंबर 4 भी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.