如果正在执行另一个脚本,则阻止python脚本运行

时间:2017-11-11 16:41:00

标签: python python-3.x

我在一个更大的系统中有两个脚本我正在开发。让我们拨打一个foo.py,另一个bar.py

foo会创建bar之后读取和删除的文件。现在,如果foo正在运行并处理文件,bar将在foo完成之前处理同一文件,从而搞砸了。

foobar由其他内容自动启动,而不是由运行它们的人手动启动。 如果foo正在处理文件,bar将无法启动,我该如何确保?

我考虑过编辑它们,以便foo在执行开始时将1写入文本文件,在完成时将0写入0,并使bar读取文本文件检查它可以开始。但是,我不确定这是最优雅的解决方案,而且如果bar在执行过程中失败,我也不想阻止foo,将文件留在1。

3 个答案:

答案 0 :(得分:1)

您可以使用subprocess

在您的主文件中:

import subprocess


def main():
    p = subprocess.Popen(['python', 'foo.py'])
    res = p.wait()
    if res == 0:
        print("foo did ok")
        # execute bar.py
    else:
        print("foo failed along the way")

在foo.py中,如果一切正常,请务必退出代码0: exit(0)(这将在主脚本中返回res。)

如果您在等待poll()完成时想要做其他事情,也可以使用foo

def main():
    p = subprocess.Popen(['python', 'foo.py'])

    while not p.poll()==0:
        print("wait for foo")
        #do some other magic. but make sure to have a break condition
        # e.g. if foo takes too long.

答案 1 :(得分:0)

可能的策略:

  • foo build todo.foo
  • 完成后重命名todo.bar
  • bar关注todo.bar,计算并完成后将其删除。

答案 2 :(得分:0)

import fcntl

pid_file = 'mysoftware.pid'
fp = open(pid_file, 'w')
try:
    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    # another instance is running
    print("already running")
    sys.exit(1)

这适合我。