我需要阻止python脚本多次运行。到目前为止,我有:
import fcntl
def lockFile(lockfile):
fp = open(lockfile, 'w')
try:
fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
return False
return True
if not lockFile("myfile.lock"):
sys.exit(0)
问题是即使文件存在,sys.exit()也永远不会被调用。也许这是一种依赖于平台的做事方式?我只需要写一个锁文件,检查它是否存在,如果它不存在或陈旧,则创建一个新文件。想法?
答案 0 :(得分:0)
如果不存在,写入文件将创建一个新文件;你可以尝试先读取文件:如果没有,则会引发错误,文件写入文件;如果有文件,程序退出。
try:
with open('lockfile.txt', 'r') as f:
lock = f.readline().strip().split()
if lock[0] == 'locked':
print('exiting')
sys.exit(0)
except FileNotFoundError:
with open('lockfile.txt', 'w') as f:
f.write('locked')
print('file written')
if __name__ == '__main__':
pass
如果您需要更复杂的东西,可以查看atexit模块
答案 1 :(得分:0)
您可以使用os.path.exists
(docs here)检查文件是否存在。如果是,那么您可以使用之前提到的sys.exit
。如果您需要的内容超过sys.exit
,请尝试使用建议的atexit
模块@Reblochon。然后该脚本将假定文件已准备好锁定,并且该方法将通过布尔值将其成功报告给用户。
import os
import sys
import fcntl
FILE_NAME = 'myfile.lock'
def lockFile(lockfile):
fp = open(lockfile, 'w') # create a new one
try:
fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
success = True # the file has been locked
except IOError:
success = False # an error occurred
fp.close() # make sure to close your file
return success
if os.path.exists(FILE_NAME): # exit the script if it exists
sys.exit(0)
print('success', lockFile(FILE_NAME))