我在一个更大的系统中有两个脚本我正在开发。让我们拨打一个foo.py
,另一个bar.py
。
foo
会创建bar
之后读取和删除的文件。现在,如果foo
正在运行并处理文件,bar
将在foo
完成之前处理同一文件,从而搞砸了。
foo
和bar
由其他内容自动启动,而不是由运行它们的人手动启动。 如果foo
正在处理文件,bar
将无法启动,我该如何确保?
我考虑过编辑它们,以便foo
在执行开始时将1写入文本文件,在完成时将0写入0,并使bar
读取文本文件检查它可以开始。但是,我不确定这是最优雅的解决方案,而且如果bar
在执行过程中失败,我也不想阻止foo
,将文件留在1。
答案 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)
这适合我。