我需要阻止python脚本运行两次

时间:2018-05-19 04:01:41

标签: python

我需要阻止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()也永远不会被调用。也许这是一种依赖于平台的做事方式?我只需要写一个锁文件,检查它是否存在,如果它不存在或陈旧,则创建一个新文件。想法?

2 个答案:

答案 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.existsdocs 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))