2009-12-21 2 views
3

Что такое рекомендуемый способ импорта кучи констант, определенных в c-style (а не C++, просто старый файл c) .h в модуль python, чтобы он мог быть использованным в проекте python. В проекте мы используем сочетание языков, и в perl я могу сделать это импортирование с помощью утилиты h2xs для создания модуля .pm.Как импортировать константы из файла .h в модуль python

определение

Константы выглядит

#define FOO 1 
enum { 
    BAR, 
    BAZ 
}; 

т.д.

комментарии C-стиля также представил должны быть надлежащим образом.

+0

Вы хотите импортировать константы и сделать их в глобальные или подобные в Python или просто хранить константы в списке? – Skurmedel

+0

@Skurmedel Я бы предпочел первый способ – Konstantin

ответ

1

Когда-то мне приходилось делать что-то подобное, и в конце концов я сделал что-то странное, но очень надежное. Работа со всеми возможностями для того, как значения могут быть определены сложно ... Например, вы должны обращаться с

#include "someotherfile.h" 
enum NewEnum { 
    A = -5, 
    B = SOME_OTHER_ENUM, 
    C, 
    D = 3 
}; 

(который на самом деле противно, и никто никогда не должен делать ...)

В конец, часть моего процесса сборки - это Perl-скрипт, который анализировал заголовочный файл для всех перечислений и определял, а затем создавал .c-файл, который включал заголовок, и был не чем иным, как кучей операторов печати, печатая фактическое значение для каждый определяет. Этот файл был скомпилирован и выполнен, а вывод этого был использован для создания следующего исходного файла (Java, в моем случае).

Это обеспечило правильность значений, поскольку я использовал препроцессор и компилятор C для получения ответов.

4

Недавно я использовал библиотеку pyparsing для сканирования констант перечисления. Вот он, наряду с образцовой строкой и результирующим выходом. Обратите внимание, что он также обрабатывает комментарии и комментирует разделы. С небольшим изменением он мог бы заполнить константы в словаре.

from pyparsing import * 

sample = ''' 
    stuff before 

    enum hello { 
     Zero, 
     One, 
     Two, 
     Three, 
     Five=5, 
     Six, 
     Ten=10 
    } 

    in the middle 

    enum blah 
    { 
     alpha, // blah 
     beta, /* blah blah 
     gamma = 10 , */ 
     zeta = 50 
    } 

    at the end 
    ''' 

# syntax we don't want to see in the final parse tree 
_lcurl = Suppress('{') 
_rcurl = Suppress('}') 
_equal = Suppress('=') 
_comma = Suppress(',') 
_enum = Suppress('enum') 

identifier = Word(alphas,alphanums+'_') 
integer = Word(nums) 

enumValue = Group(identifier('name') + Optional(_equal + integer('value'))) 
enumList = Group(enumValue + ZeroOrMore(_comma + enumValue)) 
enum = _enum + identifier('enum') + _lcurl + enumList('list') + _rcurl 

enum.ignore(cppStyleComment) 

for item,start,stop in enum.scanString(sample): 
    id = 0 
    for entry in item.list: 
     if entry.value != '': 
      id = int(entry.value) 
     print '%s_%s = %d' % (item.enum.upper(),entry.name.upper(),id) 
     id += 1 

ВЫВОД:

HELLO_ZERO = 0 
HELLO_ONE = 1 
HELLO_TWO = 2 
HELLO_THREE = 3 
HELLO_FIVE = 5 
HELLO_SIX = 6 
HELLO_TEN = 10 
BLAH_ALPHA = 0 
BLAH_BETA = 1 
BLAH_ZETA = 50 
0

я предлагаю наоборот, если это возможно: определить все константы в виде Dict Python или модуля и автоматического создания в .h в Python. Это будет намного проще.

0

Создайте скрипт/программу, которая вызывается из make и создает необходимый файл python. Если вам нужно только #define и перечисление, его не должно быть слишком сложно писать. Тогда не забудьте НЕ проверять этот файл python на исходный элемент управления, так как вы хотите, чтобы процесс сборки принудительно обновлял файл каждый раз.

Смежные вопросы