как закрыть процесс Python в конце программы - PullRequest
0 голосов
/ 24 января 2019

Мне не удается закрыть последовательное соединение, которое выполняется в процессе должным образом в конце программы.(в Windows / VSCode и Ctrl-C)

Я получаю сообщение об ошибке, и большую часть времени порт уже открыт при следующем запуске программы.

Должен ли я закончитьсначала запустить процесс?

class serialOne(Process):
    def __init__(self, serial_port, debug, baudrate=57600, timeout=1):
    ...

    def terminate(self):
        print("close ports")
        self.active = False
        self.ser.close()

    def run(self):
        while self.active:
            self.initCom()
            self.readCom()
            time.sleep(0.005)

    def main():
        global processList
        global debug

        while True:
            if debug == True:
                print("main")
            time.sleep(1.0)

        for process in processList:
            process.terminate()

и мой основной:

def main():
    global processList
    global debug

    while True:
        if debug == True:
            print("main") # actually doing nothing
        time.sleep(1.0)

    for process in processList:
        process.terminate()

это сообщение об ошибке:

Process serialOne-1:
Traceback (most recent call last):
  File "C:\Users\dgapp\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
Traceback (most recent call last):
  File "e:\_python\rfid_jacky\simple_multiprocess_rfid_02.py", line 129, in run
    time.sleep(0.005)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py", line 45, in <module>
KeyboardInterrupt
    main(ptvsdArgs)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 265, in main
    wait=args.wait)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 258, in handle_args
    debug_main(addr, name, kind, *extra, **kwargs)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 45, in debug_main
    run_file(address, name, *extra, **kwargs)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 79, in run_file
    run(argv, addr, **kwargs)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 140, in _run
    _pydevd.main()
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1925, in main
    debugger.connect(host, port)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1283, in run
    return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1290, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "c:\Users\dgapp\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\_pydev_imps\_pydev_execfile.py", line 25, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "e:\_python\rfid_jacky\simple_multiprocess_rfid_02.py", line 161, in <module>
    main()
  File "e:\_python\rfid_jacky\simple_multiprocess_rfid_02.py", line 140, in main
    time.sleep(1.0)
KeyboardInterrupt

Ответы [ 2 ]

0 голосов
/ 24 января 2019

KeyboardInterrupt происходит, когда пользователь нажимает клавишу прерывания.

Простым решением было бы перехватить исключение:

while True:
    if debug == True:
        print("main") # actually doing nothing

    try:
        # do your things
    except KeyboardInterrupt:
        print("program was interrupted by user")
        break

Вы также можете использоватьfinally ключевое слово для правильного завершения вашей программы:

try:
    while True:
        # do your things    
except KeyboardInterrupt:
    print("program was interrupted by user")
    break
finally:
    close()  # this will always happen, even if an exception was raised
0 голосов
/ 24 января 2019

Когда вы нажимаете Ctrl+C, выдается исключение KeyboardInterrupt, которое прерывает бесконечный цикл сна. Но так как вы не поймете это исключение, код после этого цикла (с process.terminate()) никогда не вызывается, что, вероятно, вызывает вашу проблему.

Итак, у вас есть несколько вариантов:

  • перехватить KeyboardInterrupt и использовать его для выхода из цикла inifite:

    def main():
        global processList
        global debug
    
        try:
            while True:
                if debug == True:
                    print("main") # actually doing nothing
                time.sleep(1.0)
        except KeyboardInterrupt:
            pass
    
        for process in processList:
            process.terminate()
    

    Что просто и очень читабельно.

  • зарегистрировать обработчик выхода, который будет запускаться при выходе из вашей программы:

    import atexit
    
    @atexit.register
    def shutdown():
        global processList
    
        for process in processList:
            process.terminate()
    
    def main():
        global debug
    
        while True:
            if debug == True:
                print("main") # actually doing nothing
            time.sleep(1.0)
    

    Что является более надежным, поскольку оно будет работать, даже если ваш процесс будет прерван другим сигналом.

...