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

问题描述:

我正在开发一个更大的系统内部有两个脚本。让我们打电话给一个foo.py和另一个bar.py如果正在执行另一个脚本,防止运行python脚本

foo创建bar之后将读取和删除的文件。现在,如果foo正在运行并正在处理某个文件,bar将在foo完成之前处理同一个文件,从而导致混乱。

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

我曾经想过编辑他们都让foo在开始执行写入1到一个文本文件和一个当它完成0,并且使bar阅读文本文件,检查wheter它可以启动。但我真的不知道这是最优雅的解决方案,而且我不希望阻止bar如果foo在执行过程中不断出现故障,剩下的文件在1

+0

难道你不能在子过程中执行foo,并且使用'Popen.poll()'等待foo完成(通过成功或失败)吗?另请参阅https://*.com/q/43274476/2923755 –

+0

您是否查看了文件锁定? – 2017-11-11 17:13:30

+0

新手在这里,没有关于子进程或文件锁定的标题。要做我自己的研究,但是,你们能指出任何好的来源吗? –

您可以使用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)。

如果您想在等待foo完成时执行其他操作,也可以使用poll()

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. 

的可能的策略:

  • foo build todo.foo
  • 完成后重命名为todo.bar
  • bar照看todo.bar,计算完成后删除它。
+0

这与他的“写1然后0”策略不一样吗?如果foo在这里失败,bar会被“阻止”,但是没有看到文件 –

+0

你是对的,你只需要少一个文件来管理。但如果foo失败,酒吧使用它是个好主意吗? –

+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) 

这对我的作品。