(原创)clang的python接口(一)

(原创)clang的python接口(一)

背景

众所周知,llvm是一个十分强大的编译器前段,由此衍生出的clang编译器已经十分成熟,大有在将来取代gcc的趋势。同时,clang也提供了强大的开发接口libclang,可以十分有效的进行词法和语法分析的工作。

libclang的python接口配置

下面是python bindings 的github镜像
python bindings for libclang
接下来介绍一下libclang+python bindings的配置方法:(ubuntu 16.04)
(1)首先安装clang编译器
可以采用apt来进行安装。

sudo apt-get install clang

如果想安装较新版本例如4.0.1(包括libfuzzer支持),建议去官网下载之后进行本地编译和配置,具体方法不再赘述。
(2)配置python bindings
同样存在两种办法
1)使用pip进行安装

sudo pip install clang==版本号 

2)或者去https://pypi.python.org/pypi这个网站上去寻找对应的包clang (版本号)。解压之后采用

python setup.py install

进行安装。
这里应该注意:
1)建议使用第一种办法进行安装。
2)无论是采用哪种办法,都必须注意clang的版本号和python bindings的版本号是否一致,否则容易出现问题。

(3)最后是配置运行,在参考内容[1]里面由这样的一段话:
Setting up
Setting up usage of the Python bindings is very easy:
Your script needs to be able to find the clang.cindex module. So either copy it appropriately or set up PYTHONPATH to point to it [4].
clang.cindex needs to be able to find the libclang.so shared library. Depending on how you build/install Clang, you will need to copy it appropriately or set up LD_LIBRARY_PATH to point to its location. On Windows, this is libclang.dll and it should be on PATH.
That arranged, you’re ready to import clang.cindex and start rolling.

这个办法笔者试过,但是效果不好,因此在这里推荐另外一种办法:
在调用模块中的方法和类的时候,首先声明libclang.so的位置:

import sys
import clang.cindex

from clang.cindex import Config
from clang.cindex import Cursor
from clang.cindex import CursorKind


Config.set_library_file("/usr/lib/llvm-4.0/lib/libclang-4.0.so.1")
#上面这行声明的libclang的位置。
index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
print tu.get_extent('li.cpp', (4, 10)).begin_int_data

这样就可以在python中调用libclang的相关类和方法了。

小结

虽然clang给出了基于ctypes的python的绑定,但是却没有提供文档,所以得靠开发者自己去阅读cindex.py的代码来进行开发,关于这一点,我会在日后在细叙。

参考文献:

http://blog.csdn.net/snsn1984/article/details/25963601

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值