概述
没有
ctypes的早期版本附带了一个名为codegenerator的模块,该模块将解析头文件,以获取常量值并将原型转换为restype/argtypes声明。然而,据我所知,这是从来没有完成的,它是从包中删除之前,纳入stdlib。在
您可以深入研究the source并拉出常量内容,同时跳过更复杂的原型内容。在
然而,我通常的做法是编写自己的生成器。在
例如,在安装过程中运行此脚本:constants = {}
with open('foo.h') as infile:
for name, value in re.findall(r'#defines+(w+)s+(.*)', infile):
try:
constants[name] = ast.literal_eval(value)
except Exception as e:
pass # maybe log something
with open('_foo_h.py', w) as outfile:
outfile.write(repr(constants))
那么foo.py就可以from _foo_h import *。在
为此编写一个完美的regexp非常困难,也许是不可能的;编写一个适用于给定项目中实际关心的头的regexp非常容易。事实上,通常你只需要上面的一个,或者跳过评论的那个。在
但有时这行不通。例如,头文件可能是#define FOO_SIZE 8对于64位构建,而{}对于32位构建。你怎么处理?在
为此,你要求编译器为你做这件事。大多数编译器都有一种方法来预处理一个文件,只要足够远就可以得到所有活动的定义。有些编译器甚至可以以一种很好的格式转储宏定义,而跳过其他所有内容。使用gcc和标志兼容的编译器,如clang,-E预处理,-dM转储宏。所以:
^{pr2}$
您可能需要传入一些额外的编译器标志来控制正确定义的内容,例如pkgconfig foo cflags的结果。在
这还将提供在foo.h(递归地)包含的任何内容中定义的宏,以及gcc的内置宏。你可能想要,也可能不想要。在the 69105 gcc flags中的某个地方,我相信有一些方法可以控制它,但我不记得它们了。在
请注意,这两种方法都不会得到常量变量或枚举,例如:static const int SPAM_SPAM_SPAM = 73;
enum {
kSPAM = 1,
kEGGS
};
解析变得更加困难;您可能希望使用真正的C99解析器,比如^{}-或者,您可能希望解析类似gccxml而不是{}的输出。但是即使这样也不能告诉你如果你不写一点逻辑kEGGS是2。在
如果你想处理C++,那就更糟糕了,用COSTEXPR和静态类成员和用户定义的文字……
或者…你必须使用ctypes?在
^{}提供了一种从Python调用C代码的不同方法,它使这一过程更加容易。在
^{}允许您编写几乎可以编译成C的Python代码,而C语言可以直接包含头文件。在
还有各种绑定生成器(例如SWIG)或绑定编写库(例如boost::python),它们可以使通过扩展模块将值导出到python更容易。在
最后
以上就是痴情汽车为你收集整理的c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?的全部内容,希望文章能够帮你解决c语言 头文件 常量,有没有办法通过ctypes加载头文件中存储的常量值?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复