我有一个Python3程序,B.py
我需要连续运行。 B.py
可能会抛出异常,当发生这种情况时,我想让它退出/关闭。 Pythong3计划A.py
应该关注,如果B.py
退出,则应该启动B.py
的另一个实例。
我已经搜索过,无法找到一个干净利落的方式。我不确定将PID写入文件是最好的方法(例如,文件是否可以被锁定?)。
作为旁注,我是一个蟒蛇诺贝,所以请尽可能明确。
答案 0 :(得分:1)
下面显示的程序旨在展示实现目标的一种非常简单的方法。
程序 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()
此程序应替换为您自己的程序,但它演示了一个正在运行的程序,该程序会随机异常崩溃。 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()