উত্তর:
import sys
sys.exit()
sys
মডিউল ডকুমেন্টেশন থেকে বিবরণ :
sys.exit([arg])
পাইথন থেকে প্রস্থান করুন। এটি
SystemExit
ব্যতিক্রম উত্থাপনের মাধ্যমে প্রয়োগ করা হয় , সুতরাং পরিশেষেtry
বিবৃতিগুলির ধারাগুলি দ্বারা নির্ধারিত ক্লিনআপ ক্রিয়াকলাপগুলি সম্মানিত হয় এবং বাইরের স্তরে প্রস্থান প্রয়াসকে থামানো সম্ভব।Argumentচ্ছিক আর্গুমেন্টটি আর্গুমেন্টটি প্রস্থান স্থিতি (শূন্যকে ডিফল্ট করা) বা অন্য ধরণের অবজেক্ট প্রদান করতে পারে ger যদি এটি একটি পূর্ণসংখ্যা হয় তবে শূন্যটিকে "সফল সমাপ্তি" হিসাবে বিবেচনা করা হয় এবং কোনও ননজারো মান শাঁস এবং এর মতো দ্বারা "অস্বাভাবিক সমাপ্তি" হিসাবে বিবেচিত হয়। বেশিরভাগ সিস্টেমে এটি 0-127 এর মধ্যে থাকতে হয় এবং অন্যথায় অপরিজ্ঞাত ফলাফল দেয়। কিছু প্রস্থানের নির্দিষ্ট প্রস্থান কোডগুলিতে নির্দিষ্ট অর্থ নির্ধারণের জন্য একটি সম্মেলন থাকে তবে এগুলি সাধারণত অনুন্নত হয়; ইউনিক্স প্রোগ্রামগুলি সাধারণত কমান্ড লাইন সিনট্যাক্স ত্রুটির জন্য 2 এবং অন্যান্য সমস্ত ধরণের ত্রুটির জন্য 1 ব্যবহার করে। যদি অন্য ধরণের অবজেক্টটি পাস হয়ে যায় তবে কোনওটি শূন্য পাসের সমতুল্য নয় এবং অন্য কোনও বস্তু মুদ্রিত হয়
stderr
এবং ফলাফলটি 1 এর প্রস্থান কোডে আসে বিশেষত,sys.exit("some error message")
কোনও ত্রুটি দেখা দিলে একটি প্রোগ্রাম থেকে বেরিয়ে আসার দ্রুত উপায়।যেহেতু
exit()
শেষ পর্যন্ত "কেবল" ব্যতিক্রম উত্থাপন করে, মূল থ্রেড থেকে ডাকা হলে এটি কেবল প্রক্রিয়া থেকে বেরিয়ে আসবে, এবং ব্যতিক্রমটি বাধা দেওয়া হয়নি।
মনে রাখবেন এটি প্রস্থান করার 'দুর্দান্ত' উপায়। @ glyphtwistedmatrix নীচে উল্লেখ করেছে যে আপনি যদি 'হার্ড প্রস্থান' চান তবে আপনি ব্যবহার করতে পারবেন os._exit(*errorcode*)
যদিও এটি সম্ভবত কিছুটা পরিমাণে নির্দিষ্ট (উদাহরণস্বরূপ এটি উইন্ডোজের নীচে একটি ত্রুটি কোড নাও নিতে পারে), এবং এটি অবশ্যই কম বন্ধুত্বপূর্ণ কারণ এটি প্রক্রিয়াটি মারা যাওয়ার আগে দোভাষীকে কোনও ক্লিনআপ করতে দেয় না।
sys.exit()
একটি SystemExit
ব্যতিক্রম উত্থাপন ।
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
পাইথন স্ক্রিপ্টটি প্রারম্ভিক করার একটি সহজ উপায় অন্তর্নির্মিত quit()
ফাংশনটি ব্যবহার করা। কোনও লাইব্রেরি আমদানি করার দরকার নেই, এবং এটি দক্ষ এবং সহজ।
উদাহরণ:
#do stuff
if this == that:
quit()
আরেকটি উপায় হ'ল:
raise SystemExit
sys.exit
মোড়কের পরিবর্তে সরাসরি বিল্টিন ব্যতিক্রম উত্থাপন করছেন
আপনি সহজভাবে ব্যবহার করতে পারেন exit()
।
মনে রাখবেন যে sys.exit()
, exit()
, quit()
, এবং os._exit(0)
বধ পাইথন ইন্টারপ্রেটার। সুতরাং, যদি এটির দ্বারা অন্য স্ক্রিপ্ট থেকে ডাকা স্ক্রিপ্টে উপস্থিত হয়, তবে এটি execfile()
উভয় স্ক্রিপ্টের সম্পাদন বন্ধ করে দেয়।
এটি এড়াতে " এক্সিকিফাইলে ডাকা স্ক্রিপ্টটির কার্যকরকরণ বন্ধ করুন " দেখুন ।
যদিও আপনার সাধারণত পছন্দ করা উচিত sys.exit
কারণ এটি অন্যান্য কোডের সাথে আরও "বন্ধুত্বপূর্ণ", তবে এটি আসলে একটি ব্যতিক্রম বাড়িয়ে তোলে।
যদি আপনি নিশ্চিত হন যে আপনাকে অবিলম্বে কোনও প্রক্রিয়া থেকে বেরিয়ে আসতে হবে এবং আপনি কিছু ব্যতিক্রম হ্যান্ডলারের অভ্যন্তরে থাকতে পারেন যা ধরতে পারে SystemExit
, তবে অন্য একটি ফাংশন রয়েছে os._exit
- যা সি স্তরে অবিলম্বে বন্ধ হয়ে যায় এবং সাধারণ টিয়ার-ডাউন কোনও সম্পাদন করে না দোভাষী উদাহরণস্বরূপ, "অ্যাক্সিট" মডিউলটির সাথে নিবন্ধিত হুকগুলি কার্যকর করা হয় না।
আমি সবেমাত্র জানতে পেরেছিলাম যে মাল্টিথ্রেডেড অ্যাপ লেখার সময় raise SystemExit
এবং sys.exit()
উভয়ই কেবল চলমান থ্রেডটিকে হত্যা করে kill অন্যদিকে, os._exit()
পুরো প্রক্রিয়াটি প্রস্থান করে। এটি আলোচিত হয়েছিল " পাইথনের কোনও থ্রেডের ভিতরে ডাকলে sys.exit () কেন প্রস্থান হয় না? "।
নীচের উদাহরণে 2 টি থ্রেড রয়েছে। কেনি এবং কার্টম্যান। কার্টম্যান চিরকালের জন্য বেঁচে থাকার কথা, তবে কেনিকে পুনরাবৃত্তভাবে বলা হয় এবং 3 সেকেন্ডের পরে মারা যেতে হবে। (পুনরাবৃত্তি কলিং সেরা উপায় নয়, তবে আমার অন্যান্য কারণও ছিল)
যদি আমরাও চাই যে কেনি মারা গেলে কার্টম্যান মারা যায়, কেনির সাথে চলে যাওয়া উচিত os._exit
, অন্যথায়, কেবল কেনি মারা যাবেন এবং কার্টম্যান চিরকাল বেঁচে থাকবেন।
import threading
import time
import sys
import os
def kenny(num=0):
if num > 3:
# print("Kenny dies now...")
# raise SystemExit #Kenny will die, but Cartman will live forever
# sys.exit(1) #Same as above
print("Kenny dies and also kills Cartman!")
os._exit(1)
while True:
print("Kenny lives: {0}".format(num))
time.sleep(1)
num += 1
kenny(num)
def cartman():
i = 0
while True:
print("Cartman lives: {0}".format(i))
i += 1
time.sleep(1)
if __name__ == '__main__':
daemon_kenny = threading.Thread(name='kenny', target=kenny)
daemon_cartman = threading.Thread(name='cartman', target=cartman)
daemon_kenny.setDaemon(True)
daemon_cartman.setDaemon(True)
daemon_kenny.start()
daemon_cartman.start()
daemon_kenny.join()
daemon_cartman.join()
from sys import exit
exit()
প্যারামিটার হিসাবে আপনি একটি প্রস্থান কোড পাস করতে পারেন, যা ওএস এ ফিরে আসবে। ডিফল্ট 0 হয়।
exit()
এবং sys.exit()
একই জিনিস নয়। অন্তর্নির্মিত exit()
স্ক্রিপ্টগুলি ব্যবহার করবেন না , এটি ইন্টারেক্টিভ শেলটির জন্য কেবল সহায় - ব্যবহার করুনsys.exit()
আমি মোট নবাগত তবে অবশ্যই এটি ক্লিনার এবং আরও নিয়ন্ত্রিত
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
প্রোগ্রামটি সমাপ্ত
চেয়ে
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __name__ == '__main__':
main()
...
প্রোগ্রামটি ট্রেসব্যাক শেষ করা হয়েছে (সর্বশেষতম কলটি শেষ হয়েছে): ফাইল "জেড: \ ডিরেক্টরি d টেস্টডিগ্রোগ.পি", লাইন 12, প্রধান () ফাইলের "জেড: \ ডিরেক্টরি \ টেস্টডিগ্রোগ্রাম.পি", লাইন 8, প্রধান sys.exit- এ ( ) সিস্টেমএক্সিট
সম্পাদন করা
মূল বক্তব্যটি হ'ল "আমি থামলাম !!!!" না হয়ে প্রোগ্রামটি সুষ্ঠু ও শান্তিপূর্ণভাবে শেষ হবে "
return
স্ক্রিপ্টটি বন্ধ করতে ব্যবহার করতে পারেন এমন পরামর্শ দেওয়ার চেষ্টা করছেন তবে এটি একটি নিখুঁত বাজে কথা । সবই return
করছে কলিং ফাংশনে একটি মান এবং নিয়ন্ত্রণের প্রবাহ ফিরিয়ে দেওয়া। সেখানে ডেকে আনা ফাংশন ডেকে ডেকে ডাকা হওয়ার পরে ঠিক মৃত্যুদণ্ড কার্যকর করা হয় return
। অবশ্যই, যদি return
আপনার স্ক্রিপ্টে এটিই আপনার উদাহরণ হিসাবে শেষ বিবৃতি হয়, তবে স্ক্রিপ্টটি ডাকা হওয়ার পরে একেবারে সমাপ্ত করা হবে।
exit
hence সুতরাং পাইথন প্রোগ্রামাররা এই কোডের গন্ধের দুর্গন্ধকে ততটা লক্ষ্য করতে পারে না); এবং সর্বশেষে, (3) একাধিক-থ্রেড কোড (যা পাইথোনিস্টাস historতিহাসিকভাবে কেবল উপেক্ষা করেছেন)।
পাইথন 3.5 তে, আমি স্ক্রিপ্টটি বন্ধ করতে এবং আমার ব্যবহারকারীদের কাছে একটি ত্রুটি বার্তা মুদ্রণের জন্য অন্তর্নির্মিত মডিউলগুলি (যেমন সিস, বায়োপি) ব্যবহার না করে অনুরূপ কোড অন্তর্ভুক্ত করার চেষ্টা করেছি। এখানে আমার উদাহরণ:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!")
exit() ## as most folks said above
পরে, আমি দেখতে পেলাম যে কেবল একটি ত্রুটি ছুঁড়ে ফেলার জন্য এটি আরও সাফল্যযুক্ত:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!")
আমার দুই সেন্ট.
পাইথন 3.8.1, উইন্ডোজ 10, 64-বিট।
sys.exit()
আমার জন্য সরাসরি কাজ করে না।
আমার বেশ কয়েকটি নেক্স্টেড লুপ রয়েছে।
প্রথমে আমি একটি বুলিয়ান ভেরিয়েবল ঘোষণা করি, যা আমি কল করি immediateExit
।
সুতরাং, প্রোগ্রাম কোডটির শুরুতে আমি লিখি:
immediateExit = False
তারপরে, সর্বাধিক অভ্যন্তরীণ (নেস্টেড) লুপ ব্যতিক্রম থেকে শুরু করে আমি লিখছি:
immediateExit = True
sys.exit('CSV file corrupted 0.')
তারপরে আমি বাহ্যিক লুপের তাত্ক্ষণিক ধারাবাহিকতায় চলে যাই, এবং কোডের দ্বারা অন্য কিছু কার্যকর করার আগে আমি লিখি:
if immediateExit:
sys.exit('CSV file corrupted 1.')
জটিলতার উপর নির্ভর করে, কখনও কখনও উপরের বিবৃতিটি বিভাগগুলি বাদেও পুনরাবৃত্তি করা প্রয়োজন etc.
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
কাস্টম বার্তাটি আমার ব্যক্তিগত ডিবাগিংয়ের জন্য, পাশাপাশি সংখ্যাগুলি একই উদ্দেশ্যে রয়েছে - স্ক্রিপ্টটি আসলে কোথায় উপস্থিত রয়েছে তা দেখার জন্য।
'CSV file corrupted 1.5.'
আমার বিশেষ ক্ষেত্রে আমি একটি সিএসভি ফাইল প্রক্রিয়া করছি, যা আমি সফ্টওয়্যারটি স্পর্শ করতে চাই না, যদি সফ্টওয়্যার সনাক্ত করে তবে এটি দূষিত হয়েছে। সুতরাং আমার পক্ষে সম্ভাব্য দুর্নীতি সনাক্ত করার সাথে সাথে পুরো পাইথন স্ক্রিপ্টটি ত্যাগ করার পরেও খুব গুরুত্বপূর্ণ important
এবং আমি এটি পরিচালনা করতে সমস্ত লুপ থেকে ক্রমান্বয়ে sys.exit-ing অনুসরণ করছি।
সম্পূর্ণ কোড: (কিছু পরিবর্তন প্রয়োজন ছিল কারণ এটি অভ্যন্তরীণ কাজের জন্য মালিকানাধীন কোড):
immediateExit = False
start_date = '1994.01.01'
end_date = '1994.01.04'
resumedDate = end_date
end_date_in_working_days = False
while not end_date_in_working_days:
try:
end_day_position = working_days.index(end_date)
end_date_in_working_days = True
except ValueError: # try statement from end_date in workdays check
print(current_date_and_time())
end_date = input('>> {} is not in the list of working days. Change the date (YYYY.MM.DD): '.format(end_date))
print('New end date: ', end_date, '\n')
continue
csv_filename = 'test.csv'
csv_headers = 'date,rate,brand\n' # not real headers, this is just for example
try:
with open(csv_filename, 'r') as file:
print('***\nOld file {} found. Resuming the file by re-processing the last date lines.\nThey shall be deleted and re-processed.\n***\n'.format(csv_filename))
last_line = file.readlines()[-1]
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
resumedDate = start_date
if last_line == csv_headers:
pass
elif start_date not in working_days:
print('***\n\n{} file might be corrupted. Erase or edit the file to continue.\n***'.format(csv_filename))
immediateExit = True
sys.exit('CSV file corrupted 0.')
else:
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
print('\nLast date:', start_date)
file.seek(0) # setting the cursor at the beginnning of the file
lines = file.readlines() # reading the file contents into a list
count = 0 # nr. of lines with last date
for line in lines: #cycling through the lines of the file
if line.split(',')[0] == start_date: # cycle for counting the lines with last date in it.
count = count + 1
if immediateExit:
sys.exit('CSV file corrupted 1.')
for iter in range(count): # removing the lines with last date
lines.pop()
print('\n{} lines removed from date: {} in {} file'.format(count, start_date, csv_filename))
if immediateExit:
sys.exit('CSV file corrupted 1.2.')
with open(csv_filename, 'w') as file:
print('\nFile', csv_filename, 'open for writing')
file.writelines(lines)
print('\nRemoving', count, 'lines from', csv_filename)
fileExists = True
except:
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
with open(csv_filename, 'w') as file:
file.write(csv_headers)
fileExists = False
if immediateExit:
sys.exit('CSV file corrupted 2.')
except:
ব্যতিক্রম প্রকার ছাড়া ব্যবহার করা উচিত নয় । আপনি যদি কেবলমাত্র ব্যবহার করেন except Exception:
(বা যদি সম্ভব হয় তার চেয়ে আরও বিশদ ব্যতিক্রমের প্রকারের प्रकार), তবে sys.exit()
উদ্দেশ্যটি কাজ করবে এবং আপনার এই কাজের প্রয়োজন হবে না।
sys.exit()
করা গুরুতর ত্রুটিগুলির জন্য এক প্রকারের শেষ-রিসোর্ট সমাধানের জন্য সত্যই ব্যবহৃত হয়। শুধু আমার দুটি সেন্ট :)
sys.exit()
ব্যাকগ্রাউন্ড থ্রেড দ্বারা উত্থাপিত হলে কাজ করে না (প্রক্রিয়াটি হত্যা করে না, কেবল থ্রেডটি মেরে ফেলেছে)?