字节或整数地址,而不是str实例Python 3

时间:2017-11-30 14:09:22

标签: python c++ ctypes

  

fib.cpp

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
using namespace std;

extern "C" const char *hello (char* b){
static string s = "hello ";
s = s + b;
return s.c_str();
}
  

wrap.py

import ctypes
_libfib = ctypes.CDLL('./fib.so');

def ctypes_hello(a):
    _libfib.hello.restype = ctypes.c_char_p;
    return _libfib.hello(ctypes.c_char_p(a));
  

生成.so文件

g++ -std=c++11 -shared -c -fPIC fib.cpp -o fib.o
g++ -std=c++11 -shared -Wl,-soname,fib.so -o fib.so fib.o

从命令行运行wrap.py

from wrap import *
ctypes_hello("world")
  

它与python 2完美配合。我收到错误字节或   当我切换到时,整数地址而不是str实例   Python 3

1 个答案:

答案 0 :(得分:2)

Python 3区分字节字符串和unicode字符串。所以在Python 3你的&#34;世界&#34; string是一系列Unicode代码点,而不是简单的字节字符串。所以在Python 3中尝试:

ctypes_hello(b"world")

将字节串传递给函数。