Estoy tratando de hacer un módulo de registro para Python que no funciona porque se produce un error en la creación del objeto file.

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()

fil no funcionará como None como puedo obtener una AttributeError. También traté de crear un objeto ficticio:

fil = open("dummy.tmp","w+")

pero la dummy.tmp archivo se escribe en su lugar, aunque init() se llama antes de que log() es. Obviamente no se puede abrir un nuevo archivo ya está abierto el archivo. He intentado cerrar fil antes de init(), pero Python dijo que no podía realizar write() en un archivo cerrado.

Este es el código que se tiene acceso 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!")

Me gustaría tener el registro en mi programa y no puedo encontrar una solución para esto.

  • import logging?
  • por curiosidad, ¿por qué no te encompassign esta en una clase? Im bastante seguro de que estaría de evitar este problema si usted hizo esto en una clase
  • esto no va a funcionar porque tengo un registro archivado de configuración del sistema. Ver el último fragmento de código. El archivo de accesos conflicto. Si abro el archivo con debug.py antes de init() luego no voy a ser capaz de lanzamiento del sitio, porque ya está siendo utilizado por un proceso.
  • No, completamente autodidacta.
  • Oh, lol, bueno. te va a gustar mi respuesta.
  • él está tratando de HACER un registrador de módulo, no utilizar uno existente BTW
  • No lo entiendo. Usted tiene probablemente ni idea de lo poderoso que la logging módulo es?
  • Me miró y yo todavía prefieren no utilizarlo. Todavía se interpone en el camino de archivar registros.
  • Haz lo que tengas que hacer, pero estoy bastante seguro de que usted pierda su tiempo reimplementing cosas que ya existe (y probado). ; )
  • también es posible hes tratando de aprender a hacer algo en su propia? siempre es una buena práctica para implementar algo que ya existe en su propio.
  • es derecho. Sólo he estado usando Python para un par de meses. Yo no soy exactamente lo que usted considere profesional.
  • Siempre es una buena práctica para aprender algunos módulos básicos que se utilizan en casi cualquier proyecto.

InformationsquelleAutor Galen Nare | 2015-05-19

3 Comentarios

  1. 5

    Su problema es que usted no ceder a la global fil:

    def init(fname):
        fil = open(fname, 'w+')

    Esto crea una nueva variable local llamada fil.

    Si desea asignar a la variable global fil que usted necesita para llevar en el ámbito local:

    def init(fname):
        global fil
        fil = open(fname, 'w+')
    • Gracias. Yo había aprendido que global sólo podía ser utilizado fuera de las funciones. He aprendido mal.
    • Y ahora aprender a olvidar global a todos y tratar de no usarlo nunca más.
  2. 1

    Si usted desea HACER su propio módulo de registro, entonces usted puede desear para convertir lo que ya tiene en una clase, por lo que puede importar como un módulo.

    #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()

    Si usted hizo esto como una clase, usted no tendría que seguir la pista de variables globales en el primer lugar (lo cual es entendido generalmente como mala práctica en el mundo de la programación: ¿Por qué son variables globales mal? )

    Ya que ahora es un módulo por su propia cuenta, cuando usted quiere usar en otro programa en python para hacer esto sería:

    from LoggerThingie import LoggerThingie
    #because module filename is LoggerThingie.py and ClassName is LoggerThingie

    y, a continuación, utilizar dondequiera que usted desee, por ejemplo:

    x = LoggerThingie('filename.txt') #create LoggerThingie object named x

    y cada vez que desee insertar registros en él:

    x.log('log this to the file')

    y cuando usted está finalmente listo:

    x.halt() # when ur done
  3. 0

    Si usted no quiere empezar con un archivo vacío podría utilizar StringIO a mantener los mensajes en la memoria y escritura en el disco al final, pero ten cuidado, si algo pasó y no escribió los mensajes se pierden.

    • Por favor, mira a los comentarios sobre la cuestión.

Dejar respuesta

Please enter your comment!
Please enter your name here