我有一些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吗?在
--泰铢
目前没有回答
相关问题 更多 >
编程相关推荐