【问题标题】:Delete log file if it is empty after being closed日志文件关闭后若为空则删除
【发布时间】:2014-01-09 18:42:40
【问题描述】:

我有一个启动通用后台进程并记录它的库函数。

def LaunchAndLog(cmd):
    cmd_args = cmd.split() # Split arguments into array
    logfile = cmd_args[0] + '.log'
    with open(logfile,'w') as log:
        return subprocess.Popen(cmd_args, stdout=log,stderr=log)

主要问题:是否可以修改此功能,以便在关闭日志文件时,如果它是空的它会自动删除?

注意:我想要一个可以调用此函数并忘记它的解决方案。我不想每次工作结束后都要记得调用清理函数。

(被拒绝?)想法:我可以使用threading 启动一个单独的线程来监控进程和/或日志文件,但这似乎比必要的复杂。

注意:必须在 Python 2.7 中工作,但我也对 Python 3 解决方案感兴趣,如果它更简单的话。

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    尝试颠倒概念,仅在您准备好编写文件时创建文件。创建自己的类来处理文件对象:

    class MyFile():
        def __enter__(self):
            return self
    
        def __init__(self, path):
            ''' store the path, but don't actually open the file '''
            self.path = path
            self.file_object = None
    
        def write(self, s):
            ''' you open the file here, just before writing '''
            if not self.file_object:
                self.file_object = open(self.path, 'w')
            self.file_object.write(self, s)
    
        def close(self):
            ''' close the file '''
            if self.file_object:
                self.file_object.close()
    
        def __exit__(self, exc_type, exc_value, exc_traceback):
            self.close()
    

    那么你的with 语句就变成了这样:

    with MyFile(logfile) as log:
    

    从 supergra 手动合并的提议但被拒绝的编辑

    【讨论】:

    • 这并不像所写的那样工作。它需要一个 __enter__ 函数,而 __exit__ 函数需要接受 4 个参数,而不是 1 个。请参阅此处进行编辑:stackoverflow.com/review/suggested-edits/3772114 被 SO 暴徒有用地拒绝了。
    • 抱歉,我又遇到了一个问题。您需要在类中定义一个fileno() 函数。我这样做了:def fileno(self): if self.file_object: return self.file_object.fileno() else: return None。也许有更好的方法。
    • @user2066480, __exit__() 调用 close()。无法编辑出来
    猜你喜欢
    • 2021-02-01
    • 2011-07-30
    • 1970-01-01
    • 2019-04-18
    • 2012-10-02
    • 2016-12-24
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多