Python 个项目的调试和发布构建策略
Debug and Release Build Strategy for Python Projects
我有一个软件 (2100 SLOC) 我认为 运行 有两个不同的版本:一个版本向控制台提供详细的调试信息,另一个版本是优化的发行版本。
我的目标是维护一个 git
分支。有没有办法标记代码的调试部分并向 Python 解释器发出信号以忽略代码的这些部分?
可能的应用包括:打印语句、Python 的日志记录工具、分析和断言 [编辑:通过设置 -O
旗帜].
我找到了答案here:
if __debug__:
doSomething()
要将 __debug__
设置为 false
,您需要使用标志 -O
或 -OO
运行 Python
我认为你把这个复杂化了。理想情况下,您不应该为开发环境和生产环境使用不同的代码路径,而只是使用不同的配置,否则很难确定您的测试是否真正反映了代码在部署时的行为方式。分析和调试代码之类的事情应该在该过程之外,你 运行 在 你的代码库而不是 部分 你的代码库.
如果您只关心日志记录,只需在不同的环境中设置不同的输出级别即可。假设你有 a standard library logging setup,你可以这样做:
import logging
import os
logging.basicConfig(
level=getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG')),
...
)
在您的入口点,这样您可以在您的生产环境中设置一个明确的 LOG_LEVEL
环境变量(the allowed values 之一),并默认为 DEBUG
用于开发。或者将默认设置为生产级别(例如 ERROR
)并在您的开发环境中明确设置它。然后,您应该 仅 通过 logging
输出消息,而根本不使用 print
。
您还应该让记录器处理任何字符串插值,即使用:
logger.info('hello %s', 'world')
而不是:
logger.info('hello %s' % 'world') # or logger.info('hello {}'.format('world'))
因此,如果该日志记录级别未激活,它可以为您优化插值。
我有一个软件 (2100 SLOC) 我认为 运行 有两个不同的版本:一个版本向控制台提供详细的调试信息,另一个版本是优化的发行版本。
我的目标是维护一个 git
分支。有没有办法标记代码的调试部分并向 Python 解释器发出信号以忽略代码的这些部分?
可能的应用包括:打印语句、Python 的日志记录工具、分析和断言 [编辑:通过设置 -O
旗帜].
我找到了答案here:
if __debug__: doSomething()
要将 __debug__
设置为 false
,您需要使用标志 -O
或 -OO
我认为你把这个复杂化了。理想情况下,您不应该为开发环境和生产环境使用不同的代码路径,而只是使用不同的配置,否则很难确定您的测试是否真正反映了代码在部署时的行为方式。分析和调试代码之类的事情应该在该过程之外,你 运行 在 你的代码库而不是 部分 你的代码库.
如果您只关心日志记录,只需在不同的环境中设置不同的输出级别即可。假设你有 a standard library logging setup,你可以这样做:
import logging
import os
logging.basicConfig(
level=getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG')),
...
)
在您的入口点,这样您可以在您的生产环境中设置一个明确的 LOG_LEVEL
环境变量(the allowed values 之一),并默认为 DEBUG
用于开发。或者将默认设置为生产级别(例如 ERROR
)并在您的开发环境中明确设置它。然后,您应该 仅 通过 logging
输出消息,而根本不使用 print
。
您还应该让记录器处理任何字符串插值,即使用:
logger.info('hello %s', 'world')
而不是:
logger.info('hello %s' % 'world') # or logger.info('hello {}'.format('world'))
因此,如果该日志记录级别未激活,它可以为您优化插值。