2010-04-21 42 views
2

我需要用Python来模拟C的预处理器特性。用Python/Ruby模仿C预处理器?

如果我想运行调试版本,我使用的以C

#ifdef DEBUG 
printf(...) 
#endif 

我只是用-DDEBUG或类似的触发或关闭如下。

我可以在Python/Ruby中使用什么方法? 我的意思是,我该如何控制python/ruby​​脚本的行为,以便可以更改影响项目中所有脚本文件的变量?

+1

为什么不实际使用C预处理器?这是我的一位同事在Javascript源代码中进行条件编译时所做的。 – 2010-04-21 16:31:33

+0

你想要你的代码实际预处理?即这些行是否会对性能造成一定的影响,因此在某些情况下需要删除它们,或者仅仅是为了方便使用command参数来影响程序行为?因为,如果后者是这种情况,那么在代码本身中实现逻辑可能有一点意义(使用optparse等)。 – 2010-04-21 17:11:41

回答

2

您几乎可以使用实际的C预处理器。如果您将文件重命名为.c,则可以执行此操作:gcc -w -E input/file.py.c -o output/file.py

主要问题似乎与评论。预处理器将会抱怨python注释行是无效的预处理器指令。您可以通过使用C++注释(// comment)来解决此问题。或者,更好的想法是只编写自己的简单预处理器。如果您只需要#define功能,那么您只是在说要做一个搜索并替换您的文件。

另一种解决办法是这样的:

def nothing(*args): 
    pass 

def print_debug(msg): 
    print msg 

if not DEBUG: 
    print_debug = nothing 

这样,如果你在调试模式不是你的打印语句没有做任何事情。

5

您通常在此用例中使用python logging功能。这是在配置文件中配置的,您可以设置输出级别。如果您熟悉java log4j,则使用非常接近。

2

使用pypreprocessor

最新版本,也可以通过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 

你去那里。用python实现的C风格预处理器条件编译。

注意事项:该模块兼容python2x和python3k。

声明:我是pypreprocessor的作者。