আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা থ্রেড ব্যবহার করে এবং প্রচুর এইচটিটিপি অনুরোধ করে। আমি মনে করি যা ঘটছে তা হ'ল এইচটিটিপি অনুরোধটি (urlib2 ব্যবহার করে) পড়ছে, এটি ব্লক করছে এবং CtrlCপ্রোগ্রামটি থামাতে সাড়া দিচ্ছে না । এই কাছাকাছি কোন উপায় আছে?
আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা থ্রেড ব্যবহার করে এবং প্রচুর এইচটিটিপি অনুরোধ করে। আমি মনে করি যা ঘটছে তা হ'ল এইচটিটিপি অনুরোধটি (urlib2 ব্যবহার করে) পড়ছে, এটি ব্লক করছে এবং CtrlCপ্রোগ্রামটি থামাতে সাড়া দিচ্ছে না । এই কাছাকাছি কোন উপায় আছে?
উত্তর:
উইন্ডোজে, একমাত্র নিশ্চিত উপায় হ'ল ব্যবহার করা CtrlBreak। তাত্ক্ষণিকভাবে প্রতিটি অজগর লিপি থামিয়ে দেয়!
(মনে রাখবেন যে কিছু কিছু কীবোর্ডে "বিরতি" "লেজ" হিসাবে লেবেলযুক্ত))
Break
? আমি কীভাবে এটি টাইপ করব?
টিপলে Ctrl+ + cযখন একটি পাইথন প্রোগ্রাম ইচ্ছার কারণ পাইথন চলমান একটি বাড়াতে KeyboardInterrupt
ব্যতিক্রম। সম্ভবত এমন একটি প্রোগ্রাম যা প্রচুর এইচটিটিপি অনুরোধ করে, তার প্রচুর ব্যতিক্রম হ্যান্ডলিং কোড থাকবে। যদি - ব্লকের 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
ব্লকের বাইরে থাকলে পরের একটি ব্যতিক্রম উত্থাপিত হবে ।
যদি এটি পাইথন শেল ব্যবহার করে চলতে থাকে Ctrl+ Zঅন্যথায় python
প্রক্রিয়াটি সনাক্ত করে এটি মেরে ফেলুন।
^Z
-> [1]+ Stopped
-> kill %1
চাকরি # 1 বন্ধ করার জন্য (বা
fg
এটিকে ঠিক ফিরিয়ে আনবে।
Ctrl+Z
পাইথন স্ক্রিপ্ট বন্ধ করার উপযুক্ত উপায় নয় এবং যদি আপনি বিরতি প্রক্রিয়া পুনরায় শুরু করার পরিকল্পনা না করেন তবে এড়ানো উচিত।
বাধা প্রক্রিয়াটি হার্ডওয়্যার এবং ওএস নির্ভর। সুতরাং আপনি যেখানে অজগর স্ক্রিপ্টটি চালাচ্ছেন তার উপর নির্ভর করে আপনার খুব আলাদা আচরণ হবে। উদাহরণস্বরূপ, উইন্ডোজ মেশিনে আমাদের 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(সিস্টেম রিকোয়েস্ট) কী তার নিজস্ব জীবন নিতে পারে ...
এই পোস্টটি পুরানো তবে আমি সম্প্রতি লিনাক্সে পাইথন স্ক্রিপ্টগুলি সমাপ্ত না করার Ctrl+ একই সমস্যায় পড়েছি C। আমি Ctrl+ \( SIGQUIT
) ব্যবহার করেছি ।
Ctrl+ + Dউইন্ডোজ এবং লিনাক্সের জন্য পার্থক্য
দেখা যাচ্ছে যে পাইথন ৩.6 হিসাবে পাইথন ইন্টারপ্রেটার লিনাক্স এবং উইন্ডোজের জন্য Ctrl+ Cআলাদাভাবে পরিচালনা করে । লিনাক্স জন্য, Ctrl+ + Cকাজ করবে বেশিরভাগই আশানুরূপ উইন্ডোজ তবে Ctrl+ + C বেশিরভাগই যদি পাইথন যেমন কল ব্লক চলছে বিশেষত কাজ করে না thread.join
বা ওয়েব প্রতিক্রিয়া উপর অপেক্ষা। এটি তবে কাজ করে না time.sleep
। পাইথন ইন্টারপ্রেটারে কী চলছে তার সুন্দর ব্যাখ্যা এখানে । নোট করুন যে Ctrl+ Cউত্পন্ন করে SIGINT
।
সমাধান 1: ব্যবহার Ctrl+Break বা সমতুল্য
টার্মিনাল / কনসোল উইন্ডোতে কীবোর্ড শর্টকাটগুলির নীচে ব্যবহার করুন যা SIGBREAK
ওএসের নিম্ন স্তরে উত্পন্ন হবে এবং পাইথন ইন্টারপ্রেটারকে সমাপ্ত করবে।
ম্যাক ওএস এবং লিনাক্স
Ctrl+ Shift+ \বা Ctrl+\
উইন্ডোজ :
সমাধান 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
ctrl + c
না , তবে প্রদর্শন করা হচ্ছে না KeyboardInterrupt
।
যারা সাহায্য করতে পারে।
আপনি আপনার টাস্ক ম্যানেজারটি খুলতে পারেন (সিটিআরএল + ওএল + মুছুন, তারপরে টাস্ক ম্যানেজারের কাছে যান) এবং অজগরটির জন্য এটি দেখতে পারেন এবং সার্ভারটি বলা হয় (উদাহরণস্বরূপ) _go_app (নামকরণের কনভেনশন হ'ল: _রেজ_অ্যাপ)।
যদি আমি _গো_এপ টাস্কটি শেষ করি তবে এটি সার্ভারটি শেষ করবে, তাই ব্রাউজারে গিয়ে এটি "অপ্রত্যাশিতভাবে শেষ হয়েছে" বলবে, আমি গিট ব্যাশও ব্যবহার করি এবং যখন আমি কোনও সার্ভার শুরু করি, তখন আমি বাশের শেলের মধ্যে সার্ভারটি ভেঙে ফেলতে পারি না সিটিআরএল + সি বা সিটিআরটিএল + বিরতি দিয়ে, তবে একবার আপনি পাইথন টাস্কটি শেষ করে (63৩. m এমবি ব্যবহার করছেন) এটি ব্যাশে সার্ভার স্ক্রিপ্টটি ভেঙে ফেলবে এবং আমাকে গিট ব্যাশ শেলটি ব্যবহার করার অনুমতি দেবে।
রেকর্ড, আমার রাস্পবেরী 3B + + (দৌড়ানো raspbian) এ প্রক্রিয়া নষ্ট হয়েছে জন্য ছিল Ctrl+ + '। আমার ফরাসি অ্যাজার্টি কীবোর্ডে স্পর্শটিও '4 নম্বরে।