繁体   English   中英

Python 有条件运行多个脚本

[英]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()}")


但:

  • 我可以在 for 循环中按名称导入和调用函数吗?
  • 修改所有脚本(带有代码音调)以将它们“转换”为函数是否真的值得(或有意义)?
  • 使用我编写的 try-exception,如果脚本失败,我会得到错误吗?

我在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM