Mimic C препроцессор с Python / Ruby? - PullRequest
2 голосов
/ 21 апреля 2010

Мне нужно имитировать функцию препроцессора C с Python.

Если я хочу запустить отладочную версию, я использую следующее с C

#ifdef DEBUG
printf(...)
#endif

Я просто использую -DDEBUG или аналогичный, чтобы включить или выключить его.

Какой метод я могу использовать для Python / Ruby? Я имею в виду, что я должен сделать, чтобы контролировать поведение скриптов python / ruby ​​таким образом, чтобы я мог изменить переменную, которая влияет на все файлы скриптов в проекте?

Ответы [ 3 ]

5 голосов
/ 21 апреля 2010

Обычно в этом случае вы используете функциональность python logging . Это настраивается в файлах конфигурации, и вы можете установить уровни вывода. Очень близко по использованию к java log4j, если вы знакомы с этим.

2 голосов
/ 07 июня 2010

Использование 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

Вот, пожалуйста. Условная компиляция препроцессора стиля C, реализованная в python.

SideNote: модуль совместим как с python2x, так и с python3k.

Отказ от ответственности: я являюсь автором pypreprocessor.

2 голосов
/ 21 апреля 2010

Вы можете практически использовать настоящий препроцессор Си.Если вы переименуете свой файл в конец .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

Таким образом, операторы print ничего не делают, если вы не в режиме отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...