使用SWIG框架可以方便地为python提供C++实现接口。
在使用 pickle 序列化工具时,dumps 出来的字符串保存会遇到问题:python会对字符串的转义字符用明文书写,比如回车写作\n,tab写作\t。然而C++处理时特别尴尬,需要自己再对这些自然语言形式的转义符进行处理。
时间紧迫,先记录下来
#include <Python.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
PyObject *my_escape2(char *in){
//char *in=NULL;
//in = PyString_AsString(pin);
int k,L=strlen(in);
char *pi=in;
char *out= (char *)malloc( strlen(in)+1 ); //output
char *po=out;
//printf("in=%s.\n",pi);
while( *pi !='\0'){
*po = *pi;
if( *(pi+1) !='\0' && *pi == '\\'){
char v=*(pi+1);
switch(v){
case 'n':*po='\n'; pi+=2;break;
case 't':*po='\t'; pi+=2;break;
case '\\':*po='\\'; pi+=2;break;
case '\'':*po='\''; pi+=2;break;
case '\"':*po='\"'; pi+=2;break;
case 'b':*po='\b'; pi+=2;break;
default:
*po = *pi;pi++;
}
}else pi++;
po++;
}
*po = '\0';
//printf("ot=%s.\n",out);
PyObject *str=PyString_FromString(out);
return str;
}
void my_escape(char *in, char *out){
int k,L=strlen(in);
char *pi=in,*po=out;
bool normal = true;
while( *pi !='\0'){
*po = *pi;
if( *(pi+1) !='\0' && *pi == '\\'){
char v=*(pi+1);
switch(v){
case 'n':*po='\n'; pi+=2;break;
case 't':*po='\t'; pi+=2;break;
case '\\':*po='\\'; pi+=2;break;
case '\'':*po='\''; pi+=2;break;
case '\"':*po='\"'; pi+=2;break;
case 'b':*po='\b'; pi+=2;break;
default:
*po = *pi;pi++;
}
}else pi++;
po++;
}
*po = '\0';
}
/*int main(){
char s[100]={'H','\\','b','l','o','\\','n','L','\\','\'','\\','\"','A','.','\0'};
char *out = (char *)malloc( strlen(s)+1 );
my_escape(s,out);
printf("in=%s,in_LEN=%d,size=%d.\n",s,strlen(s),sizeof(s));
printf("ot=%s,ot_LEN=%d,size=%d.\n",out,strlen(out),sizeof(out));
for(int k=0;k<15;k++)printf("out[%d]=%c,hex=%x.\n",k,out[k],out[k]);
return 0;
}*/
// '(lp0\nI0\naI1\naI2\na.'
日后会补上分析过程。