How to terminate a Python script

前端 未结 10 1062
予麋鹿
予麋鹿 2020-11-22 04:34

I am aware of the die() command in PHP which exits a script early.

How can I do this in Python?

相关标签:
10条回答
  • 2020-11-22 04:45

    In Python 3.5, I tried to incorporate similar code without use of modules (e.g. sys, Biopy) other than what's built-in to stop the script and print an error message to my users. Here's my example:

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

    Later on, I found it is more succinct to just throw an error:

    ## My example revised:
    if "ATG" in my_DNA: 
        ## <Do something & proceed...>
    else: 
        raise ValueError("Start codon is missing! Check your DNA sequence!")
    
    0 讨论(0)
  • 2020-11-22 04:48
    import sys
    sys.exit()
    

    details from the sys module documentation:

    sys.exit([arg])

    Exit from Python. This is implemented by raising the SystemExit exception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

    The optional argument arg can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero is considered “successful termination” and any nonzero value is considered “abnormal termination” by shells and the like. Most systems require it to be in the range 0-127, and produce undefined results otherwise. Some systems have a convention for assigning specific meanings to specific exit codes, but these are generally underdeveloped; Unix programs generally use 2 for command line syntax errors and 1 for all other kind of errors. If another type of object is passed, None is equivalent to passing zero, and any other object is printed to stderr and results in an exit code of 1. In particular, sys.exit("some error message") is a quick way to exit a program when an error occurs.

    Since exit() ultimately “only” raises an exception, it will only exit the process when called from the main thread, and the exception is not intercepted.

    Note that this is the 'nice' way to exit. @glyphtwistedmatrix below points out that if you want a 'hard exit', you can use os._exit(*errorcode*), though it's likely os-specific to some extent (it might not take an errorcode under windows, for example), and it definitely is less friendly since it doesn't let the interpreter do any cleanup before the process dies. On the other hand, it does kill the entire process, including all running threads, while sys.exit() (as it says in the docs) only exits if called from the main thread, with no other threads running.

    0 讨论(0)
  • 2020-11-22 04:48
    from sys import exit
    exit()
    

    As a parameter you can pass an exit code, which will be returned to OS. Default is 0.

    0 讨论(0)
  • 2020-11-22 04:58

    I'm a total novice but surely this is cleaner and more controlled

    def main():
        try:
            Answer = 1/0
            print  Answer
        except:
            print 'Program terminated'
            return
        print 'You wont see this'
    
    if __name__ == '__main__': 
        main()
    

    ...

    Program terminated

    than

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

    ...

    Program terminated Traceback (most recent call last): File "Z:\Directory\testdieprogram.py", line 12, in main() File "Z:\Directory\testdieprogram.py", line 8, in main sys.exit() SystemExit

    Edit

    The point being that the program ends smoothly and peacefully, rather than "I'VE STOPPED !!!!"

    0 讨论(0)
  • 2020-11-22 04:59

    My two cents.

    Python 3.8.1, Windows 10, 64-bit.

    sys.exit() does not work directly for me.

    I have several nexted loops.

    First I declare a boolean variable, which I call immediateExit.

    So, in the beginning of the program code I write:

    immediateExit = False
    

    Then, starting from the most inner (nested) loop exception, I write:

                immediateExit = True
                sys.exit('CSV file corrupted 0.')
    

    Then I go into the immediate continuation of the outer loop, and before anything else being executed by the code, I write:

        if immediateExit:
            sys.exit('CSV file corrupted 1.')
    

    Depending on the complexity, sometimes the above statement needs to be repeated also in except sections, etc.

        if immediateExit:
            sys.exit('CSV file corrupted 1.5.')
    

    The custom message is for my personal debugging, as well, as the numbers are for the same purpose - to see where the script really exits.

    'CSV file corrupted 1.5.'
    

    In my particular case I am processing a CSV file, which I do not want the software to touch, if the software detects it is corrupted. Therefore for me it is very important to exit the whole Python script immediately after detecting the possible corruption.

    And following the gradual sys.exit-ing from all the loops I manage to do it.

    Full code: (some changes were needed because it is proprietory code for internal tasks):

    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.')
    
    
    0 讨论(0)
  • 2020-11-22 05:03

    While you should generally prefer sys.exit because it is more "friendly" to other code, all it actually does is raise an exception.

    If you are sure that you need to exit a process immediately, and you might be inside of some exception handler which would catch SystemExit, there is another function - os._exit - which terminates immediately at the C level and does not perform any of the normal tear-down of the interpreter; for example, hooks registered with the "atexit" module are not executed.

    0 讨论(0)
提交回复
热议问题