Python项目的调试和发布构建策略

Debug and Release Build Strategy for Python Projects

我有一个软件(2100 SLOC),我考虑在两个不同的版本中运行:一个版本向控制台提供详细的调试信息,另一个版本是优化的发布版本。

我的目标是要有一个单独的git分支来维护。有没有一种方法可以标记代码的调试部分并向Python解释器发出信号,以忽略代码的这些部分?

可能的应用程序包括:打印语句、python的日志记录功能、分析和断言[编辑:通过设置-O标志,这些显然被忽略了]。


我认为你把这件事弄得太复杂了。理想情况下,对于开发和生产环境,您不应该有不同的代码路径,而应该只有不同的配置,否则,很难确定测试是否实际反映了部署时代码的行为。像分析和调试代码这样的事情应该在这个过程之外,在代码库而不是代码库的一部分上运行。

如果您只关心日志记录,只需在不同的环境中设置不同的输出级别。假设您有一个标准的库日志记录设置,您可以执行如下操作:

1
2
3
4
5
6
7
import logging
import os

logging.basicConfig(
    level=getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG')),
    ...
)

在您的入口点,这样您就可以在生产环境中设置一个显式的LOG_LEVEL环境变量(允许值之一),并默认为DEBUG进行开发。或者,将默认值设为生产级别(例如,ERROR)并在开发环境中明确设置它。然后应该只通过logging输出消息,而不使用print

您还应该让记录器处理任何字符串插值,即使用:

1
logger.info('hello %s', 'world')

而不是:

1
logger.info('hello %s' % 'world')  # or logger.info('hello {}'.format('world'))

因此,如果日志记录级别没有激活,它可以为您优化插值。


我在这里找到了一个答案:

1
2
if __debug__:
    doSomething()

要将__debug__设置为false要求运行带有标志-O-OO的python。