小能豆

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

py

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

你能帮助我理解为什么“log”变量不起作用…并且屏幕上没有记录任何内容吗?

谢谢!

main.py:

#!/opt/local/bin/python
    import sys
    sys.path.append('CLUSTER')
    import clusterlogging.differentlogging
    clusterlogging.differentlogging.consolelogging()

log.debug("Successfully logged in")

不同的日志记录.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

阅读 16

收藏
2024-12-09

共1个答案

小能豆

问题的根本原因在于,log.debug("Successfully logged in") 的调用是在你定义 log 变量之前发生的。你在 differentlogging.py 中调用了 log.debug,但在调用之前,log 变量并没有被正确定义或初始化。

错误解析:

  • 在你的代码中,log 是在 differentlogging.py 中定义的全局变量。
  • 然而,在 main.py 中,log.debug("Successfully logged in") 语句会在 log 定义之前被执行。
  • 因为你在 consolelogging() 函数内创建了 log 变量,所以在 main.py 中并没有正确引用到这个 log 变量,导致了 NameError

解决方案:

  1. 确保 consolelogging() 被正确调用并初始化 log,然后再使用 log.debug()
  2. differentlogging.py 中,确保在 consolelogging() 中设置好 log,并且从外部调用时,能够访问到它。

修改代码:

main.py

#!/opt/local/bin/python
import sys
sys.path.append('CLUSTER')
import clusterlogging.differentlogging

# Call the logging setup function
clusterlogging.differentlogging.consolelogging()

# Now log should be initialized and available
log.debug("Successfully logged in")

differentlogging.py

#!/opt/local/bin/python

import logging

class NullHandler(logging.Handler):
    def emit(self, record):
        pass

print("Console Logging loaded")

DEFAULTLOGLEVEL = logging.INFO

log = logging.getLogger(__name__)
log.setLevel(DEFAULTLOGLEVEL)  # Set default logging level
log.addHandler(NullHandler())  # Add NullHandler to prevent errors when no handlers are added

def consolelogging():
    # Initialize the logger to ensure it's ready to use
    log.debug("Console logging initialized")  # Now this will work because log is defined globally

def mysqllogging():
    print("mysql logging module here")

def sysloglogging():
    print("rsyslog logging module here")

解释:

  1. differentlogging.py 中, 我在 consolelogging() 中初始化了 log.debug(),确保每次调用时,log 都已经正确初始化。
  2. main.py 中, 调用了 consolelogging() 来初始化日志配置,然后再执行 log.debug()

流程:

  1. 当你运行 main.py 时,clusterlogging.differentlogging.consolelogging() 会被调用,初始化日志记录器。
  2. consolelogging() 中,通过 log.debug("Console logging initialized") 确保日志记录器正常工作。
  3. 然后你可以使用 log.debug("Successfully logged in") 来输出调试信息。

其他改进:

如果你希望日志记录器能够在整个程序中使用,可以考虑将 log 作为全局变量,并通过 consolelogging() 函数进行初始化,使其可以在其他模块中共享。

2024-12-09