Я недавно наткнулся на ограничение swig, касающееся размера C ++ std :: string.
У меня есть код C ++, возвращающий пару. Я заметил, что когда размер строки в паре меньше 2 *1024* 1024 * 1024-64 (2 ГБ), пара правильно возвращается, и строка отображается в собственную строку Python. Однако, если строка больше 2 ГБ, то в 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 довольно длинный используется для представления размера строки в коде swig bridge.
>>> s=graphdb.large_string(12)
>>> print s
(20, 'AAAAAAAAAAAA')
>>> s=graphdb.large_string(2*1024*1024*1024)
>>> print s
(20, <Swig Object of type 'char *' at 0x7fd4205a6090>)
>>> l=graphdb.size_pstring(s)
>>> print l
2147483648
>>> fname = graphdb.save_pstring(s)
Сохранение строки в файл является правильным, и затем я могу загрузить файл в строку Python правильно.
Итак, мой вопрос: кто-нибудь знает, какую настройку swig я должен изменить, чтобы большие строки правильно отображались на собственный python?
- Thx