有没有办法在Python中执行以下预处理程序指令?
#if DEBUG
< do some code >
#else
< do some other code >
#endif
答案 0 :(得分:98)
有__debug__
,这是编译器预处理的特殊值。
if __debug__:
print "If this prints, you're not running python -O."
else:
print "If this prints, you are running python -O!"
__debug__
将被编译器替换为常量0或1,优化器将在解释源代码之前删除任何if 0:
行。
答案 1 :(得分:32)
我编写了一个名为pypreprocessor的python预处理器,它完全符合您的描述。
The source and documentation is available on GitHub
The package can also be downloaded/installed through the PyPI
以下是完成您所描述内容的示例。
from pypreprocessor import pypreprocessor
pypreprocessor.parse()
#define debug
#ifdef debug
print('The source is in debug mode')
#else
print('The source is not in debug mode')
#endif
pypreprocessor不仅可以进行实时预处理。要查看更多用例示例,请查看Google Code上的项目。
更新:有关pypreprocessor的更多信息
我完成预处理的方式很简单。从上面的示例中,预处理器导入在pypreprocessor模块中创建的pypreprocessor对象。当你在预处理器上调用parse()时,它自己使用它导入的文件并生成一个自己的临时副本,它会注释掉所有预处理器代码(以避免预处理器在无限循环中递归调用自身)和评论所有未使用的部分。
如果模块抛出异常或崩溃,则注释掉这些行与删除它们相反,必须保留错误回溯上的行号。而且我甚至已经将错误回溯重写为报告,反映了崩溃模块的正确文件名。
然后,包含后处理代码的生成文件将在运行中执行。
使用这种方法而不仅仅是在代码中添加一堆if语句的好处是,不会浪费任何执行时间来评估无用的语句,因为代码的注释部分将从编译的.pyc文件中排除
缺点(以及我创建模块的原始原因)是你不能在同一个文件中同时运行python 2x和python 3x,因为pythons interpreter在执行代码之前运行完整的语法检查,并将拒绝任何特定的版本允许预处理器运行的代码:: sigh ::。我最初的目标是能够在同一个文件中并行开发2x和3x代码,根据运行的内容创建特定于版本的字节码。
无论哪种方式,预处理器模块对于实现常见的c样式预处理功能仍然非常有用。同样,预处理器能够将后处理代码输出到文件中以供以后使用。
此外,如果要生成包含所有预处理程序指令的版本以及排除的任何#ifdef,则只需在调用parse()之前在预处理程序代码中设置标志即可。这使得从特定于版本的源文件中删除不需要的代码是一个步骤(对于爬行代码并手动删除if语句)。
答案 2 :(得分:22)
我怀疑你会讨厌这个答案。你在Python中这样做的方式是
# code here
if DEBUG:
#debugging code goes here
else:
# other code here.
由于python是一个解释器,因此没有要应用的预处理步骤,并且没有特殊的优势来获得特殊的语法。
答案 3 :(得分:10)
您可以在Python中使用预处理器。只需通过bin目录中的cpp(C-Preprocessor)运行脚本即可。不过我已经用Lua完成了这个并且简单解释的好处超过了更复杂的编译恕我直言。
答案 4 :(得分:3)
您可以使用正常的语言结构:
DEBUG = True
if DEBUG:
# Define a function, a class or do some crazy stuff
def f():
return 23
else:
def f():
return 42
答案 5 :(得分:2)
另一种方法是使用bash脚本注释掉仅与调试相关的代码部分。下面是一个示例脚本,用于注释其中包含“#DEBUG”语句的行。它还可以再次删除这些注释标记。
if [ "$1" == "off" ]; then
sed -e '/^#/! {/#DEBUG/ s/^/#/}' -i *.py
echo "Debug mode to $1"
elif [ "$1" == "on" ]; then
sed -e '/#DEBUG/ s/^#//' -i *.py
echo "Debug mode to $1"
else
echo "usage: $0 on | off"
fi
答案 6 :(得分:0)
改为使用通用的m4,如下所示:
ifelse(DEBUG,True,dnl`
< do some code >
dnl,dnl`
< do some other code >dnl
')
ifelse(
M4_CPU,x86_64,`
< do some code specific for M4_CPU >
',M4_CPU,arm,`
< do some code specific for M4_CPU >
',M4_CPU,ppc64le,`
< do some code specific for M4_CPU >
')
ifelse(
M4_OS,windows,`
< do some code specific for M4_OS >
',M4_OS,linux,`
< do some code specific for M4_OS >
',M4_OS,android,`
< do some code specific for M4_OS >
')
m4 -D DEBUG =真-D M4_OS = android -D M4_CPU = arm test.py.m4> test.py