私信  •  关注

Peter Mortensen Yuval F

Peter Mortensen Yuval F 最近创建的主题
Peter Mortensen Yuval F 最近回复了
8 年前
回复了 Peter Mortensen Yuval F 创建的主题 » 如何在Python中使用C库?

This paper, claiming Python to be all a scientist needs ,基本上是说:首先用Python创建所有东西的原型。然后当你需要加速一个部分时,使用SWIG并把这个部分翻译成C。

8 年前
回复了 Peter Mortensen Yuval F 创建的主题 » 如何在Python中使用C库?

退房 pyrex Cython . 它们是介于C/C++和Python之间的Python语言。

8 年前
回复了 Peter Mortensen Yuval F 创建的主题 » 如何在Python中使用C库?

我从Python & lt;-& gt;C++绑定开始这个页面,目的是链接高级数据类型(多维STL向量和Python列表):

尝试了基于两者的解决方案 ctypes boost.python (而且不是软件工程师)我发现当需要高级数据类型绑定时它们很复杂,而我发现 SWIG

因此,这个例子使用SWIG,并且已经在Linux中进行了测试(但是SWIG是可用的,并且在Windows中也被广泛使用)。

目的是使一个C++函数可用于Python,该函数采用一个2D STL向量形式的矩阵,并返回每行的平均值(作为1D STL向量)。

#include <vector>
#include "code.h"

using namespace std;

vector<double> average (vector< vector<double> > i_matrix) {

  // Compute average of each row..
  vector <double> averages;
  for (int r = 0; r < i_matrix.size(); r++){
    double rsum = 0.0;
    double ncols= i_matrix[r].size();
    for (int c = 0; c< i_matrix[r].size(); c++){
      rsum += i_matrix[r][c];
    }
    averages.push_back(rsum/ncols);
  }
  return averages;
}

等效标题(“code.h”)为:

#ifndef _code
#define _code

#include <vector>

std::vector<double> average (std::vector< std::vector<double> > i_matrix);

#endif

我们首先编译C++代码来创建一个对象文件:

g++ -c -fPIC code.cpp

然后我们定义 SWIG interface definition file

%module code
%{
#include "code.h"
%}
%include "std_vector.i"
namespace std {

  /* On a side note, the names VecDouble and VecVecdouble can be changed, but the order of first the inner vector matters! */
  %template(VecDouble) vector<double>;
  %template(VecVecdouble) vector< vector<double> >;
}

%include "code.h"

使用SWIG,我们从SWIG接口定义文件生成C++接口源代码。

swig -c++ -python code.i

g++ -c -fPIC code_wrap.cxx  -I/usr/include/python2.7 -I/usr/lib/python2.7
g++ -shared -Wl,-soname,_code.so -o _code.so code.o code_wrap.o

我们现在可以在Python脚本中使用该函数:

#!/usr/bin/env python

import code
a= [[3,5,7],[8,10,12]]
print a
b = code.average(a)
print "Assignment done"
print a
print b
8 年前
回复了 Peter Mortensen Yuval F 创建的主题 » 如何在Python中使用C库?

你应该看看 Boost.Python . 以下是他们网站上的简短介绍:

Boost Python库是连接Python和 C++。它允许您快速和无缝地显示C++类。 函数和对象到Python,反之亦然,不使用特殊的 非侵入式的,这样您就不必更改C++代码了。 所有这些都是为了包装它,使Boost.Python成为公开 Python的第三方库。图书馆对高级语言的使用 包装代码具有一种声明性接口的外观 定义语言(IDL)。