Совместное использование переменных Python между пакетами / модулями

1

пытаясь понять и научиться писать пакеты... тестирование с помощью чего-то, что я всегда использовал, запись...

Не могли бы вы помочь мне понять, почему переменная "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
  • 1
    Рекомендуемый шебанг для Python: #!/usr/bin/env python .
  • 1
    Что-то не так с вашим постом - из того, что я вижу, оно не скомпилируется. Например, строка после def sysloglogging(): не имеет def sysloglogging(): . Кроме того, ваш код в consolelogging() кажется, не делает ничего полезного, так как определения там локальны для этой функции. Документация по ведению журнала показывает, как организовать ведение журнала между несколькими модулями - см. Docs.python.org/howto/…
Теги:

3 ответа

4
Лучший ответ

log - глобальная переменная в модуле differentlogging log. Таким образом, вы можете получить к нему доступ как clusterlogging.differentlogging.log.

Вы также можете сделать что-то вроде from clusterlogging.differentlogging import log а затем получить доступ к нему как к log.

Изменение: на самом деле, когда вы снова просматриваете свой код, я не знаю, что с этим делать. Не могли бы вы исправить ваш отступ кода, чтобы он имел смысл? Вы определяете log внутри функции consolelogging? Если это так, вам нужно либо сделать его глобальным с global log либо вернуть его из функции и назначить его log переменных в строке, где вы вызываете эту функцию.

0

Это вернет массив журнала, и вы сможете использовать связанную с ним функцию ведения журнала.

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"
0

Ваш 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

Обычно вы не хотите загромождать глобальное пространство имен всем содержимым, определенным в модуле. Импортируйте только то, что вам нужно. Это более аккуратно и помогает документировать то, что вы на самом деле используете.

  • 0
    import clusterlogging.differentlogging as difflogging ; from difflogging import log есть ошибка. Импортирование модуля с использованием as меняет только имя, которое ему дано в пространстве имен импорта; он все еще хранится под полным именем в sys.modules .
  • 0
    Я попытался из журнала импорта clusterlogging.differentlogging и получил: AttributeError: у объекта 'module' нет атрибута 'log'. Полное решение моей проблемы выложено ниже
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню