我正在尝试为Python创建一个无法正常工作的日志记录模块,因为它无法创建文件对象。
debug.py:
import os
import datetime
import globals
global fil
fil = None
def init(fname):
fil = open(fname, 'w+')
fil.write("# PyIDE Log for" + str(datetime.datetime.now()))
def log(strn):
currentTime = datetime.datetime.now()
fil.write(str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn)
print str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn
def halt():
fil.close()
当我得到None
时, fil将无法用作AttributeError
。我也试过创建一个虚拟对象:
fil = open("dummy.tmp","w+")
但是dummy.tmp
文件会被写入,即使在init()
之前调用log()
也是如此。显然,您无法在已打开的文件上打开新文件。我尝试在fil
之前关闭init()
,但Python表示无法在已关闭的文件上执行write()
。
这是访问debug.py
if os.path.exists(temp):
os.rename(temp, os.path.join("logs","archived","log-" + str(os.path.getctime(temp)) + ".txt"))
debug.init(globals.logPath)
debug.log("Logger initialized!")
我想登录我的程序,但我找不到解决方法。
答案 0 :(得分:5)
您的问题是您没有分配到全球fil
:
def init(fname):
fil = open(fname, 'w+')
这将创建一个名为fil
的新局部变量。
如果要分配给全局变量fil
,则需要将其带入本地范围:
def init(fname):
global fil
fil = open(fname, 'w+')
答案 1 :(得分:1)
如果您想创建自己的日志记录模块,那么您可能希望将已有的内容转换为类,以便将其作为模块导入。
#LoggerThingie.py
import os
import datetime
class LoggerThingie(object):
def __init__(self,fname):
self.fil = open(fname, 'w+')
self.fil.write("# PyIDE Log for" + str(datetime.datetime.now()))
def log(self,strn):
currentTime = datetime.datetime.now()
self.fil.write(str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn)
print str(currentTime) + ' ' + str(os.getpid()) + ' ' + strn
def halt(self):
self.fil.close()
如果你把它作为一个类,你就不必首先跟踪全局变量(这通常被认为是编程领域的不良实践:Why are global variables evil?)
由于它现在是一个独立的模块,当你想在另一个python程序中使用它时,你会这样做:
from LoggerThingie import LoggerThingie
#because module filename is LoggerThingie.py and ClassName is LoggerThingie
然后在任何地方使用它,例如:
x = LoggerThingie('filename.txt') #create LoggerThingie object named x
并且每次都要将日志插入其中:
x.log('log this to the file')
当你最终完成时:
x.halt() # when ur done
答案 2 :(得分:0)
如果您不想以空文件开头,可以使用StringIO将消息保存在内存中,并在最后将它们写入磁盘,但要小心,如果发生了什么事情并且您没有写入他们将丢失的信息。