[英]Run multiple scripts in Python with conditions
我有几个脚本,比方说 first.py、second.py、...、last.py(有数百行代码),我想按顺序运行它们并在其中任何一个失败时停止进程。 一旦全部执行完毕,我必须在 last.py 执行 30 分钟后重新执行 first.py。
我是 Python 的初学者,所以我的想法是创建一个运行调用所有这些脚本的 global.py 脚本的 .bat 文件。 所以我唯一要做的就是双击 .bat 文件。 当然,我完全不确定这是最好的方法。
我已经这样做了,并用一些简单的例子进行了测试,但我想知道是否有更好的方法来做到这一点。
我的.bat 文件是这样的
python ".\global.py"
pause
我的 global.py 就像
import datetime,time
scripts = ["first.py","second.py"] # better something like listing ".py" files with glob()
try:
for s in scripts:
exec(open(s).read())
print(f"{s} executed at {datetime.datetime.now().time()}")
# Wait 30 min
time.sleep(1800)
exec(open(scripts[0]).read())
print(f"{scripts[0]} re-executed at {datetime.datetime.now().time()}")
except BaseException as e:
print("Error:")
print(e)
是对的吗? 我听说不强烈推荐使用“exec”。 其他选项是将所有 scritps 定义为函数,例如
def function_first():
#first.py script content
if __name__ == "__main__":
function_first()
并在 global.py 中使用“import”代替。 我是说:
from datetime import datetime
from time import sleep
from first import function_first
from second import function_second
try:
function_first()
print(f"first.py executed at {datetime.now().time()}")
except BaseException as e:
print("Error in first.py:")
print(e)
raise
try:
function_second()
print(f"second.py executed at {datetime.now().time()}")
except BaseException as e:
print("Error in second.py:")
print(e)
raise
#Wait 30 min
sleep(1800)
function_first()
print(f"{scripts[0]} re-executed at {datetime.datetime.now().time()}")
但:
我在 Windows 10 中使用 Python 3。谢谢!
回答你的问题:
是对的吗? 我听说不强烈推荐使用“exec”。
exec
只是不好的做法,它使您的代码不可读且不可预测。
我可以在 for 循环中按名称导入和调用函数吗?
是的,那是最好的就是做你想做的。
修改所有脚本(带有代码音调)以将它们“转换”为函数是否真的值得(或有意义)?
视情况而定,但如果您的所有脚本都可以使用python script.py
和无参数运行,那么导入和运行可能不需要您修改它们中的任何一个。
如果您的脚本没有if __name__ == "__main__":
块,那么它们的所有代码都将在导入时运行,因此您必须将exec()
调用替换为__import__()
(导入需要一个模块名称,所以最后没有.py
)。
这也是一个糟糕的解决方案,您真的应该重组代码以导入函数,然后在 global.py 中调用它们。 如果您打算在将来重用或修改这些脚本 - 花时间重构所有内容是值得的。
使用我编写的 try-exception,如果脚本失败,我会得到错误吗?
是的,您的try-except
会捕获在执行您的脚本之一时遇到的任何异常。
理想情况下,您应该这样做:
from script1 import function1
from script2 import function2
...
from scriptn import functionn
scripts = [function1, function2, ..., functionn]
try:
for func in scripts :
func()
time.sleep(1800)
function1()
print(f"{function1} re-executed at {datetime.datetime.now().time()}")
except Exception as e:
print("Error:")
print(e)
我现在无法访问 python3 来测试它,但看起来你可以从 python3 完成所有这些!
您的主要 python 脚本执行from subprocess import check_output
。
然后你可以在循环中使用check_output
来调用你的其他 python 脚本:
check_output(f"python {yourScriptPathVariable}", shell=True).decode()
这将返回您的 python 脚本 output。理想情况下,这些脚本 output 要么是 0 表示成功,要么是其他内容表示失败,因此您可以轻松地跳出您所在的循环。
半年后重新运行脚本可以很容易地由批处理文件处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.