什麼是推薦的方式來導入一堆以c風格定義的常量(不是C++,只是普通的舊c).h文件到python模塊中,以便它可以用於python項目的一部分。在該項目中,我們使用混合的語言,並且在perl中,我可以通過使用h2xs實用程序生成.pm模塊來執行此操作。如何從.h文件導入常量到Python模塊
常量定義看起來像
#define FOO 1
enum {
BAR,
BAZ
};
等
C風格的評論也提出了一個必須妥善處理。
什麼是推薦的方式來導入一堆以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