一、前言

        python有时候需要用到c或者c++的库,这里我们将介绍三种调用c扩展的方法。分别用swig,stypes,和python C扩展。三种方法各有优缺点,但第三种方法最为常用。我使用到的平台为windows10,python3.6 ,vs2015

二、swig调用c扩展

       首先介绍第一种方法,这里我参考了一篇博客:“https://www.jianshu.com/p/a257e630fe42Windows平台下Python使用swig调用C++ 中使用SWIG的Python调用C/C++的方法”。都写的挺好的,但是还是要亲自实践才能真正掌握这个方法。结合连篇博客,自己动手跟着做了一遍,把整个过程记录如下。

1、下载安装swig

        首先在 www.swig.org 下载swig安装包,解压安装包到任意路径,路径中最好不要带空格。完成之后,将swig.exe所在的路径添加环境路径中。具体过程如下:

step1 安装下载:进入官网->点击“download”->点击“download area”->点击“ swigwin-3.0.12”(这里面包含了swig.exe文件而“ swig-3.0.12”中不包含)。

step2 添加到环境路径:右击我的电脑->选择属性->选择高级系统设置->环境变量->双击系统变量里面的path->编辑将swig.exe所在的目录添加进去即可。截图如下:

Python airtest 扩展命令 python拓展c_解决方案

2、准备c++/c代码和接口文件(这里我用的是c++版本)。

 建立c++的源文件、头文件以及swig接口文件:jsample.cpp,jsample.h,三个文件如下:

/* jsample.h */
#ifndef JSAMPLE_H
#define JSAMPLE_H
//void cHelloWorld();
int compute(int a, int b);
#endif
/* jsample.cpp */
#include <iostream>
#include "jsample.h"
using namespace std;
  
int compute(int a, int b)
{
    int temp = (a+b)*(a-b);
    return temp;
}
/* File : jsample.i */
%module jsample
 
%inline %{
#include "jsample.h"
%}
int compute(int a,int b);

        可以用记事本来建立这三个文件,方法如下:以jsample.cpp为例,首先新建一个记事本文件,命名为jsample,输完内容之后,另存为jsample.cpp(注意后面要加.cpp),保存类型为“所有文件”。另外两个也是类似的,最后生成的文件结果如下:

Python airtest 扩展命令 python拓展c_c++_02

3、使用swig生成部分文件 

        打开cmd,进入jsample.i文件所在的目录(三个文件要在同一个目录下)。输入:swig -python -c++ jsample.i如果是c的话就不需要添加c++了。(要注意python要写在前面,c++写在后面,否则可能会出错)

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_03

        运行完成之后,在文件夹中就会多出两个文件了。如下图:

Python airtest 扩展命令 python拓展c_python_04

4、使用vs编译文件(我使用的是vs2015)

step1:新建c++工程项目

 新建项目,选择win32控制台应用程序,输入工程名称,我命名为test.

Python airtest 扩展命令 python拓展c_python_05

点击下一步,应用程序类型选择dll,附加选项选择空项目。

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_06

点击完成之后,将文件拖到工程文件中,文件会自动放置在对应的位置。

Python airtest 扩展命令 python拓展c_c++_07

 step2:配置vs环境

配置管理设置为:活动解决方案配置设为Release,活动解决方案平台设置为x64(本机为64位)

Python airtest 扩展命令 python拓展c_c++_08

 方法如下:

  • 修改目标输出文件:目标文件名在$(ProjectName)前面加上下划线_,目标文件扩展名将.dll改成.pyd。(这一步可以在生成解决方案之后直接修改文件名称也可以)。

Python airtest 扩展命令 python拓展c_解决方案_09

  • 配置头文件:项目->属性->VC++目录->包含目录

Python airtest 扩展命令 python拓展c_解决方案_10

如果缺少上面这一步的话就会出现以下错误,无法导入python包. 

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_11

  • 配置库:项目->属性->添加库目录

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_12

 step3:生成解决方案

     生成->生成解决方案。成功后,打开工程文件夹,x64下的release中有一个_test.pyd文件。然后将文件名改成_jsample,然后放在之前swig生成的jsample.py文件一起。(非常抱歉,这里我走了弯路,实际上只需要将vs中的工程名直接设置为jsample就可以了)

5、测试使用

需要运行这个jsample.py这个文件,只需要两个文件:jsample.py和_jsample.pyd,其他的都可以不用了。下面我们来用cmd命令测试一下,如果是在pycharm中使用,只需要将这两个文件一起放在工程工程夹下就可以了。

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_13

cmd命令运行:

打开cmd命令,进入到jsample.py文件夹下,运行python,输入下面的代码:

import jsample
print('this is the test running.\n')
aa = jsample.compute(5,2)
print(aa)

可以看到,运行结果如下:

Python airtest 扩展命令 python拓展c_Python airtest 扩展命令_14

  这说明程序已经成功了。