如何从python引用C文件中的#defines?

mfi*_*sch 8 python-c-api python-c-extension

我有一个C文件,有一堆#defines用于我想从python引用的位.有足够的它们,我宁愿不将它们复制到我的python代码中,而是有一种可接受的方法直接从python引用它们?

注意:我知道我可以打开头文件并解析它,这很简单,但如果有更多的pythonic方式,我想使用它.

编辑:

这些是非常简单的#define,用于定义掩码中位的含义,例如:

#define FOO_A 0x3
#define FOO_B 0x5
Run Code Online (Sandbox Code Playgroud)

mca*_*fio 6

假设C .h文件只包含#defines(因此没有任何外部链接),那么以下内容适用于swig 2.0(http://www.swig.org/)和python 2.7(已测试).假设包含just的文件名为just_defines.h,如上所示:

#define FOO_A 0x3
#define FOO_B 0x5
Run Code Online (Sandbox Code Playgroud)

然后:

swig -python -module just just_defines.h ## generates just_defines.py and just_defines_wrap.c
gcc -c -fpic just_defines_wrap.c -I/usr/include/python2.7 -I. ## creates just_defines_wrap.o
gcc -shared just_defines_wrap.o -o _just.so ## create _just.so, goes with just_defines.py
Run Code Online (Sandbox Code Playgroud)

用法:

$ python 
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import just
>>> dir(just)
['FOO_A', 'FOO_B', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_just', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic']
>>> just.FOO_A
3
>>> just.FOO_B
5
>>> 
Run Code Online (Sandbox Code Playgroud)

如果.h文件还包含入口点,则需要链接某个库(或更多)以解析这些入口点.这使得解决方案变得更加复杂,因为您可能需要搜索正确的库.但对于"只是定义案例",您不必担心这一点.


Jam*_*dge 5

您可能对在Python源代码tarball目录中h2py.py找到的脚本有些幸运Tools/scripts。尽管它不能处理复杂的预处理器宏,但可能足以满足您的需求。

这是脚本顶部的功能描述:

阅读#define,并将其翻译为Python代码。处理#include语句。使用一个参数处理#define宏。任何无法识别或无法转换为有效Python的内容都会被忽略。

没有文件名参数,则充当过滤器。如果给出了一个或多个文件名,则输出将写入本地目录中的相应文件名,并转换为所有大写形式,扩展名替换为“ .py”。

通过传递形式为“ -i Regular_expression”的一个或多个选项,可以指定要忽略的其他字符串。这很有用,例如忽略对u_long的强制转换:只需指定“ -i'(u_long)'”即可。