সিটিআরএল + সি ব্যবহার করে অজগর থামানো


128

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা থ্রেড ব্যবহার করে এবং প্রচুর এইচটিটিপি অনুরোধ করে। আমি মনে করি যা ঘটছে তা হ'ল এইচটিটিপি অনুরোধটি (urlib2 ব্যবহার করে) পড়ছে, এটি ব্লক করছে এবং CtrlCপ্রোগ্রামটি থামাতে সাড়া দিচ্ছে না । এই কাছাকাছি কোন উপায় আছে?


9
আমি জানি না, তবে কমপক্ষে ওএস এক্স-এ, কন্ট্রোল + ব্যাকস্ল্যাশ ব্যবহারের ফলে এটি বন্ধ হয়ে যায় এবং আপনি একটি "পাইথন ক্র্যাশ" ডায়ালগ পেয়ে যান ... অদ্ভুত। সত্যই যে দরকারী তথ্য না, এইভাবে এটি একটি মন্তব্য!
micmoo

3
আসলে এটি টার্মিনালের সমস্ত অ্যাপ্লিকেশনগুলিতে কাজ করে ...
micmoo

1
ডেভিড বেজলি বর্ণনা করেছেন যে কোনও সিটিআরএল / সি বাধা কীভাবে মুলি-থ্রেড পাইথন স্ক্রিপ্টটিকে সিপিইউ হগতে রূপান্তর করতে পারে। এটি বেজলির আলাপের লিঙ্কের সাথে এখানে ( স্ট্যাকওভারফ্লো.com / প্রশ্নগুলি / ৯৯৯০০২/২ ) স্পর্শ পেয়েছে
নেড ডিলি

উত্তর:


189

উইন্ডোজে, একমাত্র নিশ্চিত উপায় হ'ল ব্যবহার করা CtrlBreak। তাত্ক্ষণিকভাবে প্রতিটি অজগর লিপি থামিয়ে দেয়!

(মনে রাখবেন যে কিছু কিছু কীবোর্ডে "বিরতি" "লেজ" হিসাবে লেবেলযুক্ত))


4
কী Break? আমি কীভাবে এটি টাইপ করব?
u0b34a0f6ae

5
আপনার কীবোর্ডে একটি বিরতি_ব্রেক বোতাম থাকা উচিত
জোনাট্রন

18
সেখানে না থাকলে কী হবে? আমি একটি ইন্টেল ম্যাকবুকে আছি এবং এর খুব পূর্ণ বৈশিষ্ট্যযুক্ত কীবোর্ড নেই।
ব্লু

53
লিনাক্সে আপনার Ctrl-Shift- \
Michał Zieliński

12
ctrl + Z স্ক্রিপ্টটি হত্যা করে না, এটি কেবল এটি ব্যাকগ্রাউন্ডে লুকিয়ে রাখে এবং স্থগিত করে দেয়। এটিকে স্মরণ করতে আপনি fg টাইপ করতে পারেন।
ছায়া Xu

84

টিপলে Ctrl+ + cযখন একটি পাইথন প্রোগ্রাম ইচ্ছার কারণ পাইথন চলমান একটি বাড়াতে KeyboardInterruptব্যতিক্রম। সম্ভবত এমন একটি প্রোগ্রাম যা প্রচুর এইচটিটিপি অনুরোধ করে, তার প্রচুর ব্যতিক্রম হ্যান্ডলিং কোড থাকবে। যদি - ব্লকের exceptঅংশটি নির্দিষ্ট করে না যে এটির ব্যতিক্রমগুলি কীভাবে ধরা উচিত, এটি আপনার সবেমাত্র তৈরি হওয়া ব্যতীত সমস্ত ব্যতিক্রমকে ধরে ফেলবে । একটি সঠিকভাবে কোডেড পাইথন প্রোগ্রামটি পাইথন ব্যতিক্রম শ্রেণিবিন্যাসের ব্যবহার করবে এবং কেবলমাত্র ব্যতিক্রমগুলি থেকে নেওয়া হবে ।tryexceptKeyboardInterruptException

#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 c
জেরিওন

53

যদি এটি পাইথন শেল ব্যবহার করে চলতে থাকে Ctrl+ Zঅন্যথায় pythonপ্রক্রিয়াটি সনাক্ত করে এটি মেরে ফেলুন।


25
^Z-> [1]+ Stopped -> kill %1চাকরি # 1 বন্ধ করার জন্য (বা
চাকম

23
উত্তরের সাথে যুক্ত করা মূল্যবান যে Ctrl + Z কেবল প্রক্রিয়াটি বিরতি দেয়।
মাত্তেও ইটালিয়া

2
উপরের অংশে বিশদভাবে বলার জন্য: প্রক্রিয়াটি থামানো এটিকে স্মৃতিতে এবং আপনার শেলের মধ্যে রাখে, এটি কেবল এটি CPU সংস্থান ব্যবহার করা থেকে বিরত রাখে। ফাইল, সকেট, সব কিছুই এখনও উন্মুক্ত এবং ব্যবহৃত। আসলে, টাইপিং fgএটিকে ঠিক ফিরিয়ে আনবে।
এলোমেলো ইনসানো

2
Ctrl+Zপাইথন স্ক্রিপ্ট বন্ধ করার উপযুক্ত উপায় নয় এবং যদি আপনি বিরতি প্রক্রিয়া পুনরায় শুরু করার পরিকল্পনা না করেন তবে এড়ানো উচিত।
জোশ কোরিয়া

33

বাধা প্রক্রিয়াটি হার্ডওয়্যার এবং ওএস নির্ভর। সুতরাং আপনি যেখানে অজগর স্ক্রিপ্টটি চালাচ্ছেন তার উপর নির্ভর করে আপনার খুব আলাদা আচরণ হবে। উদাহরণস্বরূপ, উইন্ডোজ মেশিনে আমাদের Ctrl+ C( SIGINT) এবং Ctrl+ Break( SIGBREAK) রয়েছে।

সুতরাং সিগিন্ট যখন সমস্ত সিস্টেমে উপস্থিত থাকে এবং পরিচালনা করা যায় এবং ধরা পড়তে পারে, তখন সিগন সিগন্যালটি উইন্ডোজ নির্দিষ্ট (এবং কনফিগ.এসওয়াইএস-এ অক্ষম করা যায় ) এবং সত্যই বিআইওএস একটি বিঘ্নিত ভেক্টর 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 সিগন্যালটি ধরতে চান তবে আপনাকে কী পসিক্স সিগন্যালটি কীটি ম্যাপ করেছে তা পরীক্ষা করতে হবে । জনপ্রিয় ম্যাপিংগুলি হ'ল:

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

Ctrl+ + Dউইন্ডোজ এবং লিনাক্সের জন্য পার্থক্য

দেখা যাচ্ছে যে পাইথন ৩.6 হিসাবে পাইথন ইন্টারপ্রেটার লিনাক্স এবং উইন্ডোজের জন্য Ctrl+ Cআলাদাভাবে পরিচালনা করে । লিনাক্স জন্য, Ctrl+ + Cকাজ করবে বেশিরভাগই আশানুরূপ উইন্ডোজ তবে Ctrl+ + C বেশিরভাগই যদি পাইথন যেমন কল ব্লক চলছে বিশেষত কাজ করে না thread.joinবা ওয়েব প্রতিক্রিয়া উপর অপেক্ষা। এটি তবে কাজ করে না time.sleep। পাইথন ইন্টারপ্রেটারে কী চলছে তার সুন্দর ব্যাখ্যা এখানে । নোট করুন যে Ctrl+ Cউত্পন্ন করে SIGINT

সমাধান 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: উইন্ডোজ এপিআই ব্যবহার করুন

নীচে কার্যকর ফাংশন রয়েছে যা উইন্ডোজ সনাক্ত করবে এবং কনসোলে 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

না, উবুন্টুতে, পাইথনটি ২. and এবং ৩.6 উভয়ের জন্য, টিপছে ctrl + cনা , তবে প্রদর্শন করা হচ্ছে না KeyboardInterrupt
রিক

7

টার্মিনালের সাথে সংযুক্ত পাইথন প্রক্রিয়াটি বন্ধ করতে ম্যাক Ctrl+ এ টিপুন \


3

ম্যাকে / টার্মিনালে:

  1. পরিদর্শক দেখান (টার্মিনাল উইন্ডো বা শেল> তদন্ত পরিদর্শকের মধ্যে ডান ক্লিক করুন)
  2. "চলমান প্রক্রিয়াগুলি" উপরে অবস্থিত সেটিংস আইকনটিতে ক্লিক করুন
  3. "সিগন্যাল প্রক্রিয়া গ্রুপ" এর অধীনে বিকল্পগুলির তালিকা থেকে চয়ন করুন (হত্যা, সমাপ্তি, বাধা, ইত্যাদি)।

1
  • Alt + F4 ব্যবহার করে প্রোগ্রামটি বন্ধ করতে বাধ্য করা (বর্তমান প্রোগ্রামটি বন্ধ করে দেয়)
  • প্রাক্তন সিএমডিতে এক্স বোতাম স্প্যামিং ming
  • টাস্ক ম্যানেজার (প্রথমে উইন্ডোজ + আর এবং তারপরে "টাস্কমিগার") এবং তারপরে টাস্কটি শেষ করুন।

যারা সাহায্য করতে পারে।


1

আপনি আপনার টাস্ক ম্যানেজারটি খুলতে পারেন (সিটিআরএল + ওএল + মুছুন, তারপরে টাস্ক ম্যানেজারের কাছে যান) এবং অজগরটির জন্য এটি দেখতে পারেন এবং সার্ভারটি বলা হয় (উদাহরণস্বরূপ) _go_app (নামকরণের কনভেনশন হ'ল: _রেজ_অ্যাপ)।

যদি আমি _গো_এপ টাস্কটি শেষ করি তবে এটি সার্ভারটি শেষ করবে, তাই ব্রাউজারে গিয়ে এটি "অপ্রত্যাশিতভাবে শেষ হয়েছে" বলবে, আমি গিট ব্যাশও ব্যবহার করি এবং যখন আমি কোনও সার্ভার শুরু করি, তখন আমি বাশের শেলের মধ্যে সার্ভারটি ভেঙে ফেলতে পারি না সিটিআরএল + সি বা সিটিআরটিএল + বিরতি দিয়ে, তবে একবার আপনি পাইথন টাস্কটি শেষ করে (63৩. m এমবি ব্যবহার করছেন) এটি ব্যাশে সার্ভার স্ক্রিপ্টটি ভেঙে ফেলবে এবং আমাকে গিট ব্যাশ শেলটি ব্যবহার করার অনুমতি দেবে। এখানে চিত্র বর্ণনা লিখুন


1

রেকর্ড, আমার রাস্পবেরী 3B + + (দৌড়ানো raspbian) এ প্রক্রিয়া নষ্ট হয়েছে জন্য ছিল Ctrl+ + '। আমার ফরাসি অ্যাজার্টি কীবোর্ডে স্পর্শটিও '4 নম্বরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.