欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Windows10系统Python2.7通过Swig调用C++过程

程序员文章站 2022-03-21 21:43:50
我用的 python版本是2.7.12: Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 1, 下载Swig 下载地址:http://www.swig.o ......

我用的 python版本是2.7.12:

python 2.7.12 (v2.7.12:d33e0cf91556, jun 27 2016, 15:24:40) [msc v.1500 64 bit (amd64)] on win32

 

1, 下载swig

  下载地址:http://www.swig.org/download.html,我下载了最新版本swigwin-4.0.0. 下载后直接解压,把 swig.exe 所在目录添加到系统环境变量 path中。在 command中输入 swig -version,如果出现版本号说明添加成功。

 

2,编写 c++代码

  头文件 example.h

 1 #pragma once
 2 
 3 #include <iostream>
 4 using namespace std;
 5 
 6 class example {
 7 public:
 8 
 9     const char* getstring();
10     void setstring(const char* str);
11 };

  example.cpp

 1 #include "example.h"
 2 
 3 void example::setstring(const char* str)
 4 {
 5     cout<<str<<endl;
 6 }
 7 
 8 const char* example::getstring()
 9 {
10     return "hello";
11 }

 

3,编写 example.i 文件

1 %module example
2 
3 %{
4 #include "example.h"
5 %}
6 
7 %include "example.h"

 

4,编写 setup.py 文件

1 from distutils.core import setup,extension
2 test_module = extension('_example',sources = ['example_wrap.cxx','example.cpp'],)
3 setup(name = 'example',
4       version = '0.1',
5       author = '',
6       description = 'simple swig example',
7       ext_modules = [test_module],
8       py_modules = ['example'],
9       )

 

5,运行命令 regedit 打开注册表,查看下列路径是否有该键值  productdir:vs安装目录\vc\auxiliary\build,如果没有则新建目录并添加键值。这个目录"vs安装目录\vc\auxiliary\build"其实是 vcvarsall.bat 文件所在目录,python要用到vcvarsall.bat。

\hkey_current_user\software\wow6432node\microsoft\visualstudio\9.0\setup\vc

因为我的vs安装在c:\vs2019,所以我设置 productdir:c:\vs2019\vc\auxiliary\build

 

6, 打开 command,cd 到 example.i  文件所在目录,确保 c++文件和 example.i  文件在同一个目录下;输入下列命令:

  swig -python -c++ example.i

  产生文件 example.py 和 example_wrap.cxx。

 

7,command继续输入命令:

  python2 setup.py build_ext --inplace

 产生 _example.pyd 文件。如果没有产生这个文件,查看错误原因,如果第 5 步没成功提示 cannot find vcvarsall.bat

 

8,command 输入 python2 进入 python环境:

>>> from example import *
>>> ex = example()
>>> ex.getstring()
'hello'
>>> ex.setstring("hello")
hello

说明:最好不要通过 visual studio 来产生 pyd 文件,因为 python与 vc版本不匹配会出现各种错误提示。比如2.7.12需要msc v.1500即vs2008版本。

ms vc++ 14.0 _msc_ver = 1900 vs2015
ms vc++ 12.0 _msc_ver = 1800 vs2013的编译器他的平台是v120
ms vc++ 11.0 _msc_ver = 1700 vs2012的编译器他的平台是v110
ms vc++ 10.0 _msc_ver = 1600 visual c++ 2010
ms vc++ 9.0 _msc_ver = 1500 visual c++ 2008
ms vc++ 8.0 _msc_ver = 1400 visual c++ 2005
ms vc++ 7.1 _msc_ver = 1310
ms vc++ 7.0 _msc_ver = 1300
ms vc++ 6.0 _msc_ver = 1200
ms vc++ 5.0 _msc_ver = 1100