文档章节

Python导入C的头文件

amita
 amita
发布于 2017/04/10 16:51
字数 356
阅读 21
收藏 0

1. 需求

经常有音频转文字的需求,讯飞听见网站效果还不错,赠送5小时免费转写时间,但用完了
想到讯飞有语音开放平台,过去一看,转写SDK还是要买时间,但语音听打接口是免费的,那就试试
费了点劲注册为开发者,下载了LInux C SDK,测了下demo,没问题。为了速度,还是用 Python 调接口吧,看上去 ctypes 实现比较自然。

2. 问题:

SDK 头文件里用enum定义了400+的错误码,为了方便调试,打算导成Python的enum定义(>=3.4)。手动拷贝感觉不爽,而且里面混杂着注释

3. 思路:

SDK库的符号表(被strip过了)
C语言分析器(不考虑)
手动清理复制(算了)

4. 选择:

还是用 gawk(比awk强大)处理下好了,比手动好点,说不准以后还能用...

5. 代码:

BEGIN {                         
    RS = "\r\n|{|}|\n"  # less is good for comment handling
    skip = 0

    print "#!/usr/bin/env python3"
    print "# -*- coding: UTF-8 -*-", "\n"
    print "from enum import Enum", "\n"
}

{
    while ($1 == "")
        next
}

# skip one-line comment, no use?
/^[[:blank:]]*(\/\/|#)/ {
    next
}

# skip comment
/^[[:blank:]]*\/\*/,  /\*\// {
    next
}

# get enum definitions
/^enum/, /;/ {
    subn = 0
    for (i=1; i<=NF; i++)
    {
        switch ($i) {
        case /^enum/: printf("class(Enum):")  #header
            break
        case /^;$/: printf("\n")  #tail
            next
        case /^(\/\/|\/\*)/:  #skip comment
            next
        default:  #body
            if (i == 1) printf("\t")
            subn = sub(/,/, "\n", $i)
            printf("%s ", $i)
            break
        }
    }
    if (subn == 0) printf("\n")
}

END {                           
    print "# end of", FILENAME
}

© 著作权归作者所有

共有 人打赏支持
amita
粉丝 7
博文 11
码字总数 6124
作品 0
广州
程序员
使用Visual Studio,几步实现Python C++扩展,以及DLL调用

decodeFile(PyObject self, PyObject args){ } static PyMethodDef methods[] = { }; import DynamsoftBarcodeReader formats = { } def initLicense(license): def decodeFile(fileName): i......

yushulx
2015/05/26
0
0
Python 与 C/C++ 交互的几种方式

python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯...

吴金瑞
06/26
0
0
如何简单地理解 Python 中的 if __name__ == '__main__'

昨天的分享:用 Python 带你看《我不是药神》 源码链接:https://pan.baidu.com/s/1Gnxc2iTWHrS7tGEveO4hQ 密码:27op 1. 摘要 通俗的理解name == 'main':假如你叫小明.py,在朋友眼中,你是...

xjtuhit
07/20
0
0
if __name__ == '__main__' 如何正确理解

前言: 朋友眼中你是小明(name == '小明'), 你自己眼中你是你自己(name == 'main'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这时你在朋友眼中: name == '小明'), 但你晚上也会打开x...

yaohong
03/27
0
0
使用SIP对C库进行Python封装

Python中使用C/C++模块有许多工具,大名鼎鼎的有SWIG(英文意思为:豪饮)、SIP(英文意思为:啜饮,小口的喝),还有boost.python等。其中SIP是从SWIG发展而来,专为Python调用C/C++模块使用...

openthings
2015/02/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx模块学习六 add_header 跨域访问

语法 Syntax: add_header name value [always];Default: --Context:http,server,location,if in location 例:/etc/nginx/conf.d/default.conf server {    listen       80; ......

Romanceling
今天
0
0
SpringBoot初探

#SpringBoot初探 三种创建SpringBoot项目的方式: 第一种:使用IDEA创建maven项目,选择maven-archetype-quickstart; 第二种:使用IDEA创建Spring Initializer,选择web组件; 第三种:使用...

向码而生
今天
2
0
IO

JAVA中IO技术:BIO、NIO、AIO 1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方...

DemonsI
今天
0
0
org.apache.commons 常用工具类

一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不抛出异常。通常放在finally块。 toString 转换IO流、 Uri、 byte[]为String。 copy IO流数据复制,...

sprouting
今天
0
0
linux使用Inotify监控目录或者文件状态变更

基本概念: Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一个文件采集进程,...

mickelfeng
今天
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部