Ограничение строки C ++ для Python с помощью Swig - PullRequest
0 голосов
/ 27 апреля 2018

Я недавно наткнулся на ограничение 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

...