Как прервать выполнение скрипта python? [дубликат]

How to Run Python Scripts Using the Command-Line#

A Python interactive session will allow you to write a lot of lines of code, but once you close the session, you lose everything you’ve written. That’s why the usual way of writing Python programs is by using plain text files. By convention, those files will use the extension. (On Windows systems the extension can also be .)

Python code files can be created with any plain text editor. If you are new to Python programming, you can try Sublime Text, which is a powerful and easy-to-use editor, but you can use any editor you like.

To keep moving forward in this tutorial, you’ll need to create a test script. Open your favorite text editor and write the following code:

Save the file in your working directory with the name . With the test script ready, you can continue reading.

Python Tutorial

  • The Origins of Python
  • Starting with Python: The Interactive Shell
  • Executing a Script
  • Indentation
  • Data Types and Variables
  • Operators
  • Sequential Data Types: Lists and Strings
  • List Manipulations
  • Shallow and Deep Copy
  • Dictionaries
  • Sets and Frozen Sets
  • An Extensive Example Using Sets
  • input via the keyboard
  • Conditional Statements
  • Loops, while Loop
  • For Loops
  • Output with Print
  • Formatted output with string modulo and the format method
  • Functions
  • Parameter Passing in Functions
  • Namespaces
  • Global and Local Variables
  • Read and Write Files
  • Modular Programming and Modules
  • Packages in Python
  • Regular Expressions
  • Regular Expressions, Advanced
  • Exception Handling

9 ответов

176

Лучший ответ

Чтобы выйти из script, вы можете использовать

Вы также можете указать значение статуса выхода, обычно целое число.

Выход с нулем, который обычно интерпретируется как успех. Ненулевые коды обычно рассматриваются как ошибки. По умолчанию нужно выйти с нулем.

Распечатывает «aa! errors!» и выходы со статусом 1.

В модуле os также есть функция _exit(). Функция sys.exit() вызывает исключение SystemExit для выхода из программы, поэтому могут выполняться операторы try и cleanup. Версия os._exit() не делает этого. Он просто заканчивает программу без каких-либо очистки или промывки выходных буферов, поэтому ее обычно не следует использовать.

Документы Python указывают, что os._exit() — это обычный способ закончить дочерний процесс, созданный при вызове os.fork(), поэтому он действительно используется в определенных обстоятельствах.

07 окт. 2008, в 18:10
Поделиться

16

07 окт. 2008, в 17:37
Поделиться

13

Вы можете поместить тело вашего script в функцию, а затем вы можете вернуться из этой функции.

07 окт. 2008, в 17:57
Поделиться

11

Вы можете использовать:

или

Необязательный параметр может быть кодом выхода или сообщением об ошибке. Оба метода идентичны. Раньше я предпочитал sys.exit, но в последнее время я переключился на повышение SystemExit, потому что он кажется лучше среди остальной части кода (из-за ключевого слова повысить).

07 окт. 2008, в 19:07
Поделиться

3

Если вся программа должна прекратить использование sys.exit(), в противном случае просто используйте пустой возврат.

07 окт. 2008, в 17:13
Поделиться

3

exit() должен сделать трюк

07 окт. 2008, в 17:13
Поделиться

2

exit() должен это сделать.

07 окт. 2008, в 18:10
Поделиться

2

07 окт. 2008, в 17:33
Поделиться

Try

Это похоже на perl

если это то, что вы ищете. Он завершает выполнение script, даже если он вызывается из импортированного модуля/def/function

26 янв. 2010, в 12:13
Поделиться

Ещё вопросы

  • 1020Как мне подключиться к базе данных MySQL на Python?
  • 291Нет модуля с именем MySQLdb
  • 1867Что ** (двойная звезда / звездочка) и * (звездочка / звездочка) делают для параметров?
  • 886Как я могу сделать разрыв строки (продолжение строки) в Python?
  • 660Может кто-нибудь объяснить __all__ в Python?
  • 601Помещение простого оператора if-then-else в одну строку
  • 447Что означает звездный оператор?
  • 453Инкремент числа Python с помощью ++
  • 404В скрипте Bash, как я могу выйти из всего скрипта, если возникает определенное условие?
  • 227SQL Server — остановить или прервать выполнение сценария SQL

How Does the Interpreter Run Python Scripts?#

When you try to run Python scripts, a multi-step process begins. In this process the interpreter will:

  1. Process the statements of your script in a sequential fashion

  2. Compile the source code to an intermediate format known as bytecode

    This bytecode is a translation of the code into a lower-level language that’s platform-independent. Its purpose is to optimize code execution. So, the next time the interpreter runs your code, it’ll bypass this compilation step.

    Strictly speaking, this code optimization is only for modules (imported files), not for executable scripts.

  3. Ship off the code for execution

    At this point, something known as a Python Virtual Machine (PVM) comes into action. The PVM is the runtime engine of Python. It is a cycle that iterates over the instructions of your bytecode to run them one by one.

    The PVM is not an isolated component of Python. It’s just part of the Python system you’ve installed on your machine. Technically, the PVM is the last step of what is called the Python interpreter.

The whole process to run Python scripts is known as the Python Execution Model.

9 ответов

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

Вместо этого напишите свою программу менеджера как сервер сокетов или что-то подобное.

Напишите сценарии как генераторы, предназначенные для приостановки выполнения (каждый раз, когда он попадает в ), и просто вызывайте по очереди, несколько раз. По завершении сценария вы получите исключение .

Для обработки команд напишите второй скрипт, который подключается к сокету управляющей программы и отправляет ему сообщения. Это будет интерфейс консоли, с которым взаимодействует пользователь (позже вы даже можете обновить его до графического интерфейса, не изменяя многое другое) .

Сервер забирает эти команды перед выполнением следующей итерации сценариев, и если сценарий приостанавливается пользователем, программа менеджера просто не вызывает в этом сценарии до тех пор, пока пользователь не скажет ему запустить его снова.

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

Это действительно из моей глубины, но, возможно, запуск сценариев в фоновом режиме и с использованием и для приостановки и продолжения работы (при условии, что Linux)?

Если бы это был Unix, я бы порекомендовал сигнал, но вот грубая версия, которая делает то, что вы просите.

Используйте Ctrl + C для паузы и ENTER для возобновления. Ctrl + Break, вероятно, может использоваться как грубое убийство, но у меня нет клавиши на этой клавиатуре.

В более надежной версии можно использовать select для канала /сокета или даже потоков.

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

Пользовательская команда может создать (или заполнить соответствующим содержимым) такой файл.

Я использовал этот подход в аналогичной ситуации, когда я хотел иметь возможность приостановить свои скрипты Python и возобновить их позже. Они содержат что-то вроде

в их основных циклах.

Это неприятно и может быть сломано, если код действительно зависит от него, но для случаев использования, когда пауза выполняется случайными пользователями, я думаю, это не имеет значения.

Команда — это просто .

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

без назначения полученного ответа переменной.

Вы пробовали очевидное и печатали подсказку, а затем читали строку из stdin? Это приостановит весь ваш сценарий.

То, что вы спросили в своем первоначальном вопросе, не очень понятно, поэтому, если это не поможет вам, объясните почему?

Я нашел такие хакерские ответы, хотя и интересные.

Наилучшим подходом является https://stackoverflow.com/a/7184165/2480481 , использующий исключение.

Поскольку я заметил, что никто не упоминает «использование отладчика», я сделаю это.

Установите pdb, отладчик Python с помощью .
Следуйте этому, чтобы сделать ваш сценарий приостановленным https://stackoverflow.com/a/39478157/2480481 с помощью Ctrl + c вместо выйти из него.

Основное преимущество использования отладчика (pdb) состоит в том, что вы можете проверять переменные, значения и т. д. Это гораздо эффективнее, чем просто приостановить /продолжить его.

Кроме того, вы можете добавить интерфейс Ipython с подключенным pdb для отладки вашего приложения при сбоях. Посмотрите: https://stackoverflow.com/a/14881323/2480481

В Windows вы можете приостановить /возобновить выполнение скриптов Python. Введите resmon в CMD или с помощью команды «Выполнить» (Windows + R). Найдите процесс сценария Python и нажмите правой кнопкой мыши> Suspend Process. Это разблокирует использование процессора, но не оперативной памяти. 😉

Вы можете использовать модуль в python.
Несмотря на то, что это отладчик, в вашем случае он помогает вам пройти и продолжить, где бы вы ни находились в коде точки останова.

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

Fabric

Скрипты для выполнения на удаленных машинах — отдельная боль. Конечно, мы живем в веке DevOps, когда кучи задач решаются с помощью Salt и Ansible. Но бывает и такое, что нужно регулярно логиниться на кластер удаленных тачек и выполнять там пачки команд. Для этого и есть fabric

  • Поддержка разных списков хостов — можно выполнять команды на серверах БД, в кластере приложения — просто пропишите удаленные тачки в скрипт.
  • Разные политики авторизции для тачек — можно юзать и ключи, и пароли.
  • Разбивка скрипта на подкоманды, группировка подкоманд в команды побольше — можно делать сколь угодно сложную логическую структуру кода, который вы хотите запускать.
  • И, конечно же, можно мешать в коде команды терминала и питонячий код!

Fabric построен вокруг Paramiko и вообще вы можете выполнять команды с помощью этой низкоуровневой библиотеки общения по SSH. Но Fabric дает необходимый уровень абстракции, который позволяет делать понятным и легкоиспользуемым.

Оператор continue¶

Оператор continue возвращает управление в начало цикла. То есть,
continue позволяет «перепрыгнуть» оставшиеся выражения в цикле и перейти
к следующей итерации.

Пример с циклом for:

In 4]: for num in range(5):
   ...     if num == 3
   ...         continue
   ...     else
   ...         print(num)
   ...

1
2
4

Пример с циклом while:

In 5]: i = 
In 6]: while i < 6
   ....     i += 1
   ....     if i == 3
   ....         print("Пропускаем 3")
   ....         continue
   ....         print("Это никто не увидит")
   ....     else
   ....         print("Текущее значение: ", i)
   ....
Текущее значение  1
Текущее значение  2
Пропускаем 3
Текущее значение  4
Текущее значение  5
Текущее значение  6

Использование continue в примере с запросом пароля (файл
check_password_with_while_continue.py):

username = input('Введите имя пользователя: ')
password = input('Введите пароль: ')

password_correct = False

while not password_correct
    if len(password) < 8
        print('Пароль слишком короткий\n')
    elif username in password
        print('Пароль содержит имя пользователя\n')
    else
        print('Пароль для пользователя {} установлен'.format(username))
        password_correct = True
        continue
    password = input('Введите пароль еще раз: ')

Тут выход из цикла выполнятся с помощью проверки флага
password_correct. Когда был введен правильный пароль, флаг выставляется
равным True, и с помощью continue выполняется переход в начало цикла,
перескочив последнюю строку с запросом пароля.

Результат выполнения будет таким:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *