ট্রেসব্যাক ছাড়াই পাইথন থেকে কীভাবে প্রস্থান করবেন?


277

আউটপুটটিতে ট্রেসব্যাক ডাম্প না রেখে কীভাবে পাইথন থেকে প্রস্থান করব তা আমি জানতে চাই।

আমি এখনও একটি ত্রুটি কোডটি ফিরিয়ে দিতে সক্ষম হতে চাই তবে আমি ট্রেসব্যাক লগটি প্রদর্শন করতে চাই না।

আমি exit(number)ট্রেস ছাড়াই ব্যবহার করে প্রস্থান করতে সক্ষম হতে চাই তবে কোনও ব্যতিক্রমের ক্ষেত্রে (প্রস্থান নয়) আমি ট্রেসটি চাই।


8
sys.exit () ব্যাকট্র্যাস প্রিন্ট না করে কার্যকর করা বন্ধ করে, একটি ব্যতিক্রম উত্থাপন করে ... আপনার প্রশ্নটি ডিফল্ট আচরণটি ঠিক কী তা বর্ণনা করে, তাই কোনও কিছুই পরিবর্তন করবেন না।
লুপার রাউচ

@ লুপার sys.exit () সিস্টেমএক্সিট ছুড়ে দেয় তা পরীক্ষা করা খুব সহজ!
Val,

4
আমি বলেছিলাম এটি কোনও ট্রেসব্যাক মুদ্রণ করে না, এটি কোনও ব্যতিক্রম বাড়ে না তা নয়।
লুপার রাউচ

আমি মনে করি যে এটি আপনার জিজ্ঞাসিত প্রশ্নের সত্যই উত্তর দিয়েছে: স্ট্যাকওভারফ্লো /
স্টেফান

2
এই প্রশ্নটি কি বিশেষত জাইথন ​​২.৪ বা এর মতো কিছুর জন্য? কারণ পাইথনের আধুনিক সংস্করণগুলির জন্য (এমনকি ২০০৯ সালেও যখন সিপিথন ২.6 এবং ৩.১, জাইথন ​​২.২, এবং আয়রন পাইথন ২.6 বোঝানো হয়েছিল), প্রশ্নটি কোনও অর্থহীন নয় এবং শীর্ষ উত্তরগুলি ভুল।
28-18

উত্তর:


300

আপনি সম্ভবত একটি ব্যতিক্রমের মুখোমুখি হচ্ছেন এবং এর কারণে (একটি ট্রেসব্যাক সহ) প্রোগ্রামটি বের হচ্ছে। সুতরাং প্রথমে করণীয় হ'ল পরিষ্কারভাবে বেরিয়ে আসার আগে সেই ব্যতিক্রমটি ধরা (সম্ভবত কোনও বার্তা সহ, উদাহরণ দেওয়া হয়েছে)।

আপনার mainরুটিনে এরকম কিছু চেষ্টা করুন :

import sys, traceback

def main():
    try:
        do main program stuff here
        ....
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)

if __name__ == "__main__":
    main()

2
শুরুতে "সিস ইম্পোর্ট এক্সিকিট" থেকে শুরু করে এমন কিছু হওয়া উচিত।
ছিনিয়ে নিন

10
যদি sys.exit () কে "মূল প্রোগ্রাম স্টাফ" বলা হয়, উপরের কোডটি sys.exit এ পাস করা মানটি ছুঁড়ে দেয়। লক্ষ্য করুন যে sys.exit SystemExit উত্থাপন করে এবং ভেরিয়েবল "e" এ প্রস্থান কোড থাকবে।
bstpierre

5
আমি stderr sys.stderr.write (msg)
ভিনিলিওস

14
আমি দৃঢ়ভাবে থেকে লাইন সরানোর সুপারিশ except Exception:করার sys.exit(0)সমেত। সমস্ত অ-পরিচালিত ব্যতিক্রমগুলিতে কোনও ট্রেসব্যাক মুদ্রণ করা এবং কোড শেষ হওয়ার পরে প্রস্থান করার জন্য এটি ইতিমধ্যে ডিফল্ট আচরণ, সুতরাং ম্যানুয়ালি কেন একই রকম বিরক্ত করবেন?
MestreLion

6
@ জে কে পি - আপনার মন্তব্য সম্পর্কিত: sys.exit()প্রোগ্রামগুলির জন্য ব্যবহার করা উচিত। exit()ইন্টারেক্টিভ শেল জন্য উদ্দেশ্যে করা হয়। পাইথনে প্রস্থান () এবং sys.exit () এর মধ্যে পার্থক্যটি দেখুন ?
ire_and_curses

81

সম্ভবত আপনি সমস্ত ব্যতিক্রম ধরার চেষ্টা করছেন এবং এটি কি SystemExitউত্থাপিত ব্যতিক্রমটিকে ধরে ফেলছে sys.exit()?

import sys

try:
    sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
    sys.exit(e)
except:
    # Cleanup and reraise. This will print a backtrace.
    # (Insert your cleanup code here.)
    raise

সাধারণভাবে, except:ব্যতিক্রম নামকরণ না করে ব্যবহার করা একটি খারাপ ধারণা। আপনি ধরতে চান না এমন সমস্ত ধরণের জিনিস ধরবেন - যেমন SystemExit- এবং এটি আপনার নিজস্ব প্রোগ্রামিং ত্রুটিও মুখোশ করতে পারে। উপরের আমার উদাহরণটি নির্বোধ, যদি না আপনি পরিষ্কারের ক্ষেত্রে কিছু করছেন। আপনি এটি দিয়ে প্রতিস্থাপন করতে পারেন:

import sys
sys.exit(1) # Or something that calls sys.exit().

আপনি যদি উত্থাপন ছাড়াই প্রস্থান প্রয়োজন SystemExit:

import os
os._exit(1)

আমি এই কোডটি করি যা ইউনিটেস্টের অধীনে চলে এবং কল হয় fork()। কাঁটাচামচ প্রক্রিয়া যখন উত্থাপিত হয় ইউনিটটেস্ট পায় SystemExit। এটি অবশ্যই কর্নার কেস!


4
-1: এই কোডটি নির্বোধ: কেন SystemExitশুধু কল করতে ধরেন sys.exit(e)? উভয় লাইন অপসারণ একই প্রভাব রয়েছে। এছাড়াও, ক্লিনআপ অন্তর্গত finally:, নয় except Exception: ... raise
MestreLion

@ মাস্টারলিয়ন: আপনি ডাউনটাতে নির্দ্বিধায় রয়েছেন তবে আপনি যদি আমার মন্তব্যটি আপনার নিজের উপরে পড়ে থাকেন তবে এটি কেবল 2.5+ এর জন্য সত্য। আপনি যদি আমার সমস্ত পোস্ট পড়ে থাকেন তবে আমি স্পষ্ট করে বলেছি যে কোডটি নির্বোধ এবং আপনার মন্তব্যে ঠিক কী বলেছিল তা প্রস্তাবিত।
bstpierre

2
দুঃখিত, আপনি ঠিক বলেছেন ... আমি পাইথন 2.5 এ ব্যতিক্রমগুলির একটি নতুন পুনর্গঠন ছিল ভুলে গিয়েছিলাম। আমি ডাউনভোটটি পূর্বাবস্থায় ফিরিয়ে আনার চেষ্টা করেছি, তবে উত্তর সম্পাদনা করা থাকলে এসও কেবল আমাকে তা করতে দেয়। সুতরাং, যেহেতু আমরা 2012 সালে রয়েছি এবং পাইথন ২.৪ প্রাচীন ইতিহাস, তাই কেন এটি সম্পাদনা করে সঠিক (বর্তমান) কোডটি সামনে না দেখায়, প্রাক-2.5 পদ্ধতিটিকে পাদটীকা হিসাবে রেখে? এটির উত্তরটি অনেক উন্নত করবে এবং আমি নীচের অংশটিকে পূর্বাবস্থায় ফিরিয়ে আনতে সক্ষম হব এবং আনন্দের সাথে এটি করব। সবার জন্য জয় :)
MestreLion

@ মাস্টারলিয়ন: আপনার পরামর্শ অনুসারে আমি সম্পাদনা শুরু করেছিলাম, তবে এই উত্তরটি কেবলমাত্র প্রশ্ন এবং একটি ২.৪ পরিবেশের প্রসঙ্গেই অর্থবোধ করে। ডাউনভোট আমাকে বিরক্ত করে না।
bstpierre


9

এরকম কিছু import sys; sys.exit(0)?


@mestreLion তাহলে আমি কেন ডিটস করব 06 18:53:17 ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "ডিবাগ_নেউ.পি", লাইন 4, <মডুল> আমদানি সিস্টেমে; sys.exit (0) SystemExit: 0 at org.python.core.PyException.fillInStackTrace (PyException.java:70) আমার কনসোলে?
Val,

3
@ ভ্যাল: কারণ আপনি স্ট্যান্ডার্ড পাইথন কনসোল ব্যবহার করছেন না। জাইথন ​​পাইথন নয় এবং এটি দেখতে (বা কমপক্ষে এটির কনসোল) ব্যতিক্রমগুলি আলাদাভাবে পরিচালনা করে।
MestreLion


9

নিম্নলিখিত কোডটি একটি ব্যতিক্রম বাড়াবে না এবং কোনও ট্রেসব্যাক ছাড়াই প্রস্থান করবে:

import os
os._exit(1)

আরও তথ্যের জন্য এই প্রশ্ন এবং সম্পর্কিত উত্তরগুলি দেখুন। অন্য সমস্ত উত্তর কেন এত বেশি জটিল হয় তা অবাক করে।


4

Sys.exit () ব্যবহার এড়াতে এবং প্রোগ্রামটি পরিষ্কারভাবে শেষ করার জন্য ব্যতিক্রমগুলি বাড়াতে / হ্যান্ডেল করার জন্য এটি আরও ভাল অনুশীলন। আপনি যদি ট্রেসব্যাকটি বন্ধ করতে চান তবে কেবল ব্যবহার করুন:

sys.trackbacklimit=0

সমস্ত স্ক্র্যাকব্যাক আউটপুট স্কোয়াশ করতে আপনি এটি আপনার স্ক্রিপ্টের শীর্ষে সেট করতে পারেন, তবে আমি এটিকে আরও স্বচ্ছভাবে ব্যবহার করতে পছন্দ করি, উদাহরণস্বরূপ "জ্ঞাত ত্রুটি" যেখানে আমি আউটপুট পরিষ্কার রাখতে চাই, যেমন foo.py ফাইলটিতে:

import sys
from subprocess import *

try:
  check_call([ 'uptime', '--help' ])
except CalledProcessError:
  sys.tracebacklimit=0
  print "Process failed"
  raise

print "This message should never follow an error."

যদি কল করা প্রসেসরর ধরা পড়ে তবে আউটপুটটি এর মতো দেখাবে:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

অন্য কোনও ত্রুটি দেখা দিলে আমরা এখনও সম্পূর্ণ ট্রেসব্যাক আউটপুট পাই।


1
sys.trackbacklimitপাইথন 3 ব্যবহার করার জন্য , এই উত্তরটি দেখুন
একিউম্যানাস

4

বিল্ট-ইন পাইথন ফাংশন ছাড়ুন () ব্যবহার করুন এবং এটিই। কোনও লাইব্রেরি আমদানি করার দরকার নেই। আমি পাইথন ৩.৪ ব্যবহার করছি



0

কি সম্পর্কে

import sys
....
....
....
sys.exit("I am getting the heck out of here!")

কোনও ট্রেসব্যাক এবং কোনওভাবে আরও স্পষ্ট নয়।


-8
# Pygame Example  

import pygame, sys  
from pygame.locals import *

pygame.init()  
DISPLAYSURF = pygame.display.set_mode((400, 300))  
pygame.display.set_caption('IBM Emulator')

BLACK = (0, 0, 0)  
GREEN = (0, 255, 0)

fontObj = pygame.font.Font('freesansbold.ttf', 32)  
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)  
textRectObj = textSurfaceObj.get_rect()  
textRectObj = (10, 10)

try:  
    while True: # main loop  
        DISPLAYSURF.fill(BLACK)  
        DISPLAYSURF.blit(textSurfaceObj, textRectObj)  
        for event in pygame.event.get():  
            if event.type == QUIT:  
                pygame.quit()  
                sys.exit()  
        pygame.display.update()  
except SystemExit:  
    pass

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