如何从.h文件导入常量到Python模块
问题描述:
什么是推荐的方式来导入一堆以c风格定义的常量(不是C++,只是普通的旧c).h文件到python模块中,以便它可以用于python项目的一部分。在该项目中,我们使用混合的语言,并且在perl中,我可以通过使用h2xs实用程序生成.pm模块来执行此操作。如何从.h文件导入常量到Python模块
常量定义看起来像
#define FOO 1
enum {
BAR,
BAZ
};
等
C风格的评论也提出了一个必须妥善处理。
答
我曾经做过类似的事情,最后我做了一些奇怪的事但非常可靠。与一切准备处理如何值可能被定义为是棘手...例如,你必须处理
#include "someotherfile.h"
enum NewEnum {
A = -5,
B = SOME_OTHER_ENUM,
C,
D = 3
};
(这是非常讨厌和任何人都不应该做的...)
在最后,我的构建过程的一部分是一个perl脚本,它解析所有枚举的头文件并进行定义,然后生成一个包含头文件的.c文件,它不过是一堆打印语句,将实际值每个定义。这个文件被编译和执行,其输出用于生成下一个源文件(在我的情况下是Java)。
这确保我得到正确的值,因为我使用C预处理器和编译器来生成答案。
答
我最近使用了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
OUTPUT:
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
答
我建议你反过来想,如果可能的话:定义一个Python字典或模块和所有的常量自动生成在Python中.H。这会很容易很多。
答
创建一个从make调用的脚本/程序并创建必要的python文件。如果你只需要#define和枚举,它不应该太难写。然后记住不要将这个python文件检入到源代码控制中,因为您希望构建过程每次强制重新生成文件。
是否要导入常量并将它们变成全局变量或某些Python语句,或者只是将常量存储在列表中? – Skurmedel 2009-12-21 19:23:17
@Skurmedel我更喜欢第一种方式 – Konstantin 2009-12-21 19:40:09