如果它没有运行,启动Python程序

时间:2017-03-02 11:10:18

标签: python-3.x

我有一个Python3程序,B.py我需要连续运行。 B.py可能会抛出异常,当发生这种情况时,我想让它退出/关闭。 Pythong3计划A.py应该关注,如果B.py退出,则应该启动B.py的另一个实例。

我已经搜索过,无法找到一个干净利落的方式。我不确定将PID写入文件是最好的方法(例如,文件是否可以被锁定?)。

作为旁注,我是一个蟒蛇诺贝,所以请尽可能明确。

1 个答案:

答案 0 :(得分:1)

下面显示的程序旨在展示实现目标的一种非常简单的方法。

A.py

程序 A 的全部目的是一遍又一遍地继续运行程序 B 。假设程序 B 有权执行,在此示例中指定了shell参数,以便它可以在Windows和Linux上轻松运行。您可以根据需要随意扩展此计划。

#! /usr/bin/env python3
import subprocess


def main():
    while True:
        subprocess.run('B.py', shell=True)


if __name__ == '__main__':
    main()

B.py

此程序应替换为您自己的程序,但它演示了一个正在运行的程序,该程序会随机异常崩溃。 EXCEPTIONS字符串直接从文档中复制,其余代码应该很容易理解。此程序的唯一用途是测试程序 A

#! /usr/bin/env python3
import builtins
import random
import time


EXCEPTIONS = '''\
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning
'''


def main():
    time.sleep(random.uniform(1, 9))
    lines = EXCEPTIONS.splitlines()
    names = [line.rsplit(None, 1)[-1] for line in lines]
    raise getattr(builtins, random.choice(names))()


if __name__ == '__main__':
    main()