Как жестко приостановить или приостановить работу сценария python после его запуска, чтобы он не принудительно закрывался после завершения? - PullRequest
0 голосов
/ 31 мая 2018

Привет, так что я работаю над сценарием Python, который включает в себя функцию цикла, но пока процесс функции цикла завершается сбоем по какой-то причине (хотя я знаю, почему), но проблема у меня есть os.system ('pause'), а также ввод («prompt:») в конце кода, чтобы приостановить всю активность, чтобы я мог прочитать сообщения об ошибках до завершения и завершения сценария, но сценарий по-прежнему выключается, мне нужен способ, чтобы HARD приостановить егоили заморозить до того, как окно внезапно закроется.Нужна помощь и дальнейшее понимание.

Ps.Дайте мне знать, если вам нужна дополнительная информация, чтобы лучше описать эту проблему.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Полагаю, вы просто «дважды щелкаете» значок в проводнике.Это имеет тот недостаток, с которым вы сталкиваетесь здесь в том, что оболочка (окно терминала) закрывается, когда процесс завершается, поэтому вы не можете сказать, что пошло не так, если он завершился из-за ошибки.

Лучшим методом будетиспользовать command prompt.Если вы не знакомы с этим, в Интернете есть много учебных пособий.

Причина, по которой это поможет решить вашу проблему, заключается в том, что, перейдя в каталог, содержащий скрипт, вы можете использовать python your_script.py (при условии pythonнаходится в переменной пути вашего окружения), чтобы запустить сценарий в том же окне.

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


Альтернативным хакерским методом было бы создание сценария, называемого чем-то вроде run_pythons.py, который будет использовать модуль subprocess для вызова вашего фактического сценария в том же окне, а затем (независимо от того, как он завершится) подождатьдля ввода перед завершением, чтобы вы могли прочитать сообщения об ошибках.

Так что-то вроде:

import subprocess
subprocess.call(('python', input('enter script name: ')))
input('press ENTER to kill me')
0 голосов
/ 31 мая 2018

Мне нужно что-то подобное в один момент.У меня была оболочка, которая загружала кучу модулей и данных, а затем ждала приглашения запустить что-то.Если бы у меня была глупая ошибка в модуле, он бы вышел, и то время, которое он потратил на загрузку всех этих данных в память, было бы потрачено впустую, что составляло> 1 мин.Для меня я хотел сохранить эти данные в памяти, даже если у меня была ошибка в модуле, чтобы я мог отредактировать модуль и перезапустить скрипт.

Для этого:

while True:
    update = raw_input("Paused. Enter = start, 'your input' = update params, C-C = exit")
    if update:
        update = update.split()
        #unrelevant stuff used to parse my update
    #custom thing to reload all my modules
    fullReload()
    try:
        #my main script that needed all those modules and data loaded
        model_starter.main(stuff, stuff2)
    except Exception as e:
        print(e)
        traceback.print_exc()
        continue
    except KeyboardInterrupt:
        print("I think you hit C-C. Do it again to exit.")
        continue
    except:
        print("OSERROR? sys.exit()? who knows. C-C to exit.")
        continue

Это сохраняло все загруженные данные, которые я захватил до начала цикла while, и предотвращало выход при ошибках.Это также означало, что я все еще мог ctrl+c выйти, мне просто нужно было сделать это из этой оболочки вместо того, чтобы добраться до основного скрипта.

Это то, что вы ищете?

Ответ в основном заключается в том, что вы должны перехватить все ваши исключения и иметь метод для перезапуска цикла, как только вы выяснили и устранили проблему.

...