пытаясь понять и научиться писать пакеты... тестирование с помощью чего-то, что я всегда использовал, запись...
Не могли бы вы помочь мне понять, почему переменная "log" не работает... и на экране не работает журнал?
Благодарю!
main.py:
#!/opt/local/bin/python
import sys
sys.path.append('CLUSTER')
import clusterlogging.differentlogging
clusterlogging.differentlogging.consolelogging()
log.debug("Successfully logged in")
differentlogging.py
#!/opt/local/bin/python
def consolelogging():
import logging
class NullHandler(logging.Handler):
def emit(self, record):
pass
print "Console Logging loaded"
DEFAULTLOGLEVEL=logging.INFO
log = logging.getLogger(__name__)
log.addHandler(NullHandler())
log.debug("Successfully logged in")
def mysqllogging():
print "mysql logging module here"
def sysloglogging():
print "rsyslog logging module here"
вывод
Console Logging loaded
Traceback (most recent call last):
File "./svnprod.py", line 10, in <module>
log.debug("Successfully logged in")
NameError: name 'log' is not defined
log
- глобальная переменная в модуле differentlogging
log
. Таким образом, вы можете получить к нему доступ как clusterlogging.differentlogging.log
.
Вы также можете сделать что-то вроде from clusterlogging.differentlogging import log
а затем получить доступ к нему как к log
.
Изменение: на самом деле, когда вы снова просматриваете свой код, я не знаю, что с этим делать. Не могли бы вы исправить ваш отступ кода, чтобы он имел смысл? Вы определяете log
внутри функции consolelogging
? Если это так, вам нужно либо сделать его глобальным с global log
либо вернуть его из функции и назначить его log
переменных в строке, где вы вызываете эту функцию.
Это вернет массив журнала, и вы сможете использовать связанную с ним функцию ведения журнала.
main.py:
#!/usr/bin/env python
import sys
sys.path.append('CLUSTER')
import clusterlogging.differentlogging
log=clusterlogging.differentlogging.ttylogging()
log.debug("Logging module loaded")
log.info ("It worked")
differentlogging.py:
#!/usr/bin/env python
def ttylogging():
print "Console Logging loaded"
import sys
import logging
class NullHandler(logging.Handler):
def emit(self, record):
pass
DEFAULTLOGLEVEL=logging.INFO
log = logging.getLogger(__name__)
log.addHandler(NullHandler())
log.setLevel(DEFAULTLOGLEVEL)
logStreamHandler = logging.StreamHandler(sys.stdout)
logStreamHandler.setFormatter(logging.Formatter("%(asctime)s %(levelname)5s %(name)s %(lineno)d: %(message)s"))
log.addHandler(logStreamHandler)
return log
def mysqllogging():
print "mysql logging module here"
def sysloglogging():
print "rsyslog logging module here"
Ваш main.py
не делает ничего, чтобы определить log
имен в глобальном пространстве имен. Импорт модуля может определять имена в пространстве имен этого модуля, но не может помещать что-либо в глобальное пространство имен.
В вашем main.py
вы должны добавить это выражение:
from clusterlogging.differentlogging import log
Кстати, я так долгое имя модуля, я бы использовал import as
:
import clusterlogging.differentlogging as difflogging
log = difflogging.log
EDIT: Я изначально рекомендовал это, но это не сработает:
from difflogging import log # doesn't work
Возможно, вы даже захотите использовать очень короткое имя, например, dl
:
import clusterlogging.differentlogging as dl
dl.log('whatever')
Поскольку dl
действительно коротко, возможно, вам не нужно связывать log
в глобальном пространстве имен.
Кроме того, вы можете получить каждое имя из модуля с помощью import *
но это не рекомендуется.
from clusterlogging.differentlogging import * # not recommended
Обычно вы не хотите загромождать глобальное пространство имен всем содержимым, определенным в модуле. Импортируйте только то, что вам нужно. Это более аккуратно и помогает документировать то, что вы на самом деле используете.
import clusterlogging.differentlogging as difflogging ; from difflogging import log
есть ошибка. Импортирование модуля с использованием as
меняет только имя, которое ему дано в пространстве имен импорта; он все еще хранится под полным именем в sys.modules
.
#!/usr/bin/env python
.def sysloglogging():
не имеетdef sysloglogging():
. Кроме того, ваш код вconsolelogging()
кажется, не делает ничего полезного, так как определения там локальны для этой функции. Документация по ведению журнала показывает, как организовать ведение журнала между несколькими модулями - см. Docs.python.org/howto/…