使用SWIG的C++字符串到Python限制

2024-06-10 01:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我最近碰到了一个与C++ STD::字符串大小有关的SUG限制。在

我有一些C++代码返回一对。我注意到,当对中的字符串的大小小于2*1024*1024-64(2GB)时,该对将正确返回,并且该字符串被映射到python本机字符串。但是,如果字符串大于2GB,那么在python中,字符串不再映射到本机python字符串。例如,使用下面的代码,并通过swig映射到python,您可以重现我的错误。在

环境::SWIG版本3.0.8,Ubuntu 16.04.3 LTS,g++5.4.0;Python 2.7.12

/////////// bridge.h
#include <vector>
#include <utility>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
pair<int, string> large_string(long sz);
long size_pstring(pair<int,string>& p);
void print_pstring(pair<int,string>& p);
string save_pstring(pair<int,string>& p);

//////////bridge.cc
#include "bridge.h"

pair<int, string> large_string(long sz){
 pair<int, string> pis;
 pis.first=20;
 pis.second=string(sz,'A');
 return pis;
}

long size_pstring(pair<int,string>& p){
 return p.second.size();
}

void print_pstring(pair<int,string>& p){
  cout<<"PSTRING: first="<<p.first<<" second.SZ="<<p.second.size()<<"\n";
  cout<<"First 100 chars: \n"<<p.second.substr(0,100)<<"\n";
}

string save_pstring(pair<int,string>& p){
  string fname="aloe.txt";
  std::ofstream ofile(fname.c_str());
  ofile<<p.second;
  ofile.close();
  return fname;
}
////////// bridge.i
%module graphdb

%include stl.i
%include "std_vector.i"

%{
#include "bridge.h"
%}
%include "bridge.h"
namespace std {
  %template(p_string)           pair<int,string>;
};
//////// makefile
all:
    swig -c++ -python bridge.i
    g++ -std=c++11 -fpic -c bridge.cc bridge_wrap.cxx -I/usr/include/python2.7/
    g++ -shared *.o -o  _graphdb.so

下面我在python中包含了一个会话,它表明这可能只是字符串如何映射的问题,而且很可能是一个int-very-long用于表示swig-bridge代码中字符串的大小。在

^{2}$

将字符串保存到文件中是正确的,接下来我可以正确地将文件加载到python字符串中。在

所以我的问题是:有人知道我应该更改什么swig-config选项来允许大字符串正确地映射到原生python吗?在

--泰铢


Tags: 字符串代码sizestringincludelongswigint