包/模块之间的python变量共享

时间:2011-08-29 23:31:15

标签: python

试图理解并学习如何编写包...用我一直使用的东西进行测试,记录......

你能帮我理解为什么'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

3 个答案:

答案 0 :(得分:4)

logdifferentlogging模块中的全局变量。因此,您可以访问它 clusterlogging.differentlogging.log

您也可以执行from clusterlogging.differentlogging import log之类的操作,然后将其作为log进行访问。

编辑:实际上,在重新审核您的代码时,我不知道该怎么做。你可以修改你的代码缩进,这样才有意义吗?您是否在log函数中定义了consolelogging?如果是这样,您需要使用global log将其设置为全局,或者从函数返回它并将其分配给调用函数的行上的变量log

答案 1 :(得分:0)

您的main.py无法在全局命名空间中定义名称log。导入模块可以在该模块的命名空间中定义名称,但不能在全局命名空间中放置任何内容。

main.py中,您应该添加以下声明:

from clusterlogging.differentlogging import log

顺便说一句,我是一个如此长的模块名称,我会使用import as

import clusterlogging.differentlogging as difflogging
log = difflogging.log
编辑:我最初推荐这个,但它不起作用:

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

您通常不希望使用模块中定义的所有内容来混淆全局命名空间。导入你需要的东西。这更整洁,有助于记录您实际使用的内容。

答案 2 :(得分: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"