我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

Posted

技术标签:

【中文标题】我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?【英文标题】:Where do I change this Python code snippet to save the temp file in the tmp-folder? 【发布时间】:2011-08-06 05:22:27 【问题描述】:

这是一个实现文件锁定的代码示例,因此应用程序只能打开一个实例。它目前可以工作,但将锁定文件保存在主文件夹(Ubuntu)中。如果应用程序崩溃,锁定文件不会被删除,这是不好的......

我不能轻易看到我应该更改代码以将其保存在 c:/tmp 文件夹中的位置吗?

#!/usr/bin/python
# -*- coding: utf-8 -*-


#implements a lockfile if program already is open
import os
import socket
from fcntl import flock

class flock(object):
    '''Class to handle creating and removing (pid) lockfiles'''

    # custom exceptions
    class FileLockAcquisitionError(Exception): pass
    class FileLockReleaseError(Exception): pass

    # convenience callables for formatting
    addr = lambda self: '%d@%s' % (self.pid, self.host)
    fddr = lambda self: '<%s %s>' % (self.path, self.addr())
    pddr = lambda self, lock: '<%s %s@%s>' %\
                              (self.path, lock['pid'], lock['host'])

    def __init__(self, path, debug=None):
        self.pid   = os.getpid()
        self.host  = socket.gethostname()
        self.path  = path
        self.debug = debug # set this to get status messages

    def acquire(self):
        '''Acquire a lock, returning self if successful, False otherwise'''
        if self.islocked():
            if self.debug:
                lock = self._readlock()
                print 'Previous lock detected: %s' % self.pddr(lock)
            return False
        try:
            fh = open(self.path, 'w')
            fh.write(self.addr())
            fh.close()
            if self.debug:
                print 'Acquired lock: %s' % self.fddr()
        except:
            if os.path.isfile(self.path):
                try:
                    os.unlink(self.path)
                except:
                    pass
            raise (self.FileLockAcquisitionError,
                   'Error acquiring lock: %s' % self.fddr())
        return self

    def release(self):
        '''Release lock, returning self'''
        if self.ownlock():
            try:
                os.unlink(self.path)
                if self.debug:
                    print 'Released lock: %s' % self.fddr()
            except:
                raise (self.FileLockReleaseError,
                       'Error releasing lock: %s' % self.fddr())
        return self

    def _readlock(self):
        '''Internal method to read lock info'''
        try:
            lock = 
            fh   = open(self.path)
            data = fh.read().rstrip().split('@')
            fh.close()
            lock['pid'], lock['host'] = data
            return lock
        except:
            return 'pid': 8**10, 'host': ''

    def islocked(self):
        '''Check if we already have a lock'''
        try:
            lock = self._readlock()
            os.kill(int(lock['pid']), 0)
            return (lock['host'] == self.host)
        except:
            return False

    def ownlock(self):
        '''Check if we own the lock'''
        lock = self._readlock()
        return (self.fddr() == self.pddr(lock))

    def __del__(self):
        '''Magic method to clean up lock when program exits'''
        self.release()

#now testing to see if file is locked = other instance of this program is running already

lock = flock('tmp.lock', True).acquire()
if lock:
    print 'doing stuff'
else:
    print 'locked!'
    exit()


#end of lockfile

【问题讨论】:

你说它是 ubuntu 的,然后又提到 c:/... 它是什么? 【参考方案1】:

使用tempfile

【讨论】:

【参考方案2】:

在脚本的结尾:

lock = flock('tmp.lock', True).acquire()

'tmp.lock' 是当前目录中文件的路径。将其更改为您需要的路径,即'c:/tmp-folder/tmp.lock'

lock = flock('c:/tmp-folder/tmp.lock', True).acquire()

但是,正如@g19fanatic 所说:您使用的是 Windows ('c:/...') 还是 Linux (Ubuntu) 系统?

【讨论】:

以上是关于我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在屏幕方向更改时附加片段?

使用片段上的按钮更改片段

如何将活动 UI 的点击传递到地图片段以将地图更改为 MAP_TYPE_HYBRID

php 在Yoast SEO中更改或删除OpenGraph输出的代码片段。此代码中有多个代码段。

代码片段 PHP,预期文件结尾,我错在哪里?

我在哪里可以找到任何 NodeJS 版本的重大更改列表