如果正在执行另一个脚本,防止运行python脚本
我正在开发一个更大的系统内部有两个脚本。让我们打电话给一个foo.py
和另一个bar.py
。如果正在执行另一个脚本,防止运行python脚本
foo
创建bar
之后将读取和删除的文件。现在,如果foo
正在运行并正在处理某个文件,bar
将在foo
完成之前处理同一个文件,从而导致混乱。
foo
和bar
由其他内容自动启动,而不是由运行它们的人手动启动。 如何确保如果foo
正在处理文件,bar
无法启动?
我曾经想过编辑他们都让foo
在开始执行写入1到一个文本文件和一个当它完成0,并且使bar
阅读文本文件,检查wheter它可以启动。但我真的不知道这是最优雅的解决方案,而且我不希望阻止bar
如果foo
在执行过程中不断出现故障,剩下的文件在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
)。
如果您想在等待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
buildtodo.foo
。 - 完成后重命名为
todo.bar
。 -
bar
照看todo.bar
,计算完成后删除它。
这与他的“写1然后0”策略不一样吗?如果foo在这里失败,bar会被“阻止”,但是没有看到文件 –
你是对的,你只需要少一个文件来管理。但如果foo失败,酒吧使用它是个好主意吗? –
准确地说,我的想法也是大声笑,但这就是他想要的嘿嘿 –
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)
这对我的作品。
难道你不能在子过程中执行foo,并且使用'Popen.poll()'等待foo完成(通过成功或失败)吗?另请参阅https://stackoverflow.com/q/43274476/2923755 –
您是否查看了文件锁定? – 2017-11-11 17:13:30
新手在这里,没有关于子进程或文件锁定的标题。要做我自己的研究,但是,你们能指出任何好的来源吗? –