使用python的ctypes调用c语言中的函数,传入字符串,打印输出异常。解决方法记录于此。


主要原因是编码格式不同导致的。python2和python3采用的默认编码不同。

python2默认就是str和unicode,str和unicode可以直接进行连接。python3默认的字符串编码是bytes和str。如果要操作unicode格式的,需要通过encode()函数先换。

c文件如下。

test.c
#include 
int test(char *temp)
{
printf("temp:%s\n", temp);
return 0;
}
test.py
#!/usr/bin/env python
import test
import os
from ctypes import *
test = cdll.LoadLibrary(os.getcwd() + '/libtest.so')
test.test('hello')

python2运行脚本输出如下

qt@tony:/mnt/hgfs/Desktop/$ /usr/bin/python2 test.py
temp:hello
temp:hello

python3运行结果

qt@tony:/mnt/hgfs/Desktop/$ /usr/bin/python3 test.py
temp:h
temp:h

解决方法,使用encode('utf-8')将字符串化成unicode格式.

更改如下

#!/usr/bin/env python
import test
import os
from ctypes import *
test = cdll.LoadLibrary(os.getcwd() + '/libtest.so')
# 将str转换成unicode
test.test('hello'.encode('utf-8'))
Tony Liu
2017-6-2, Shenzhen

Python3字符串 详解

Python3 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. Python 访问字符串中的值 P ...

python3字符串

Python3 字符串 Python字符串运算符 + 字符串连接 a + b 输出结果: HelloPython * 重复输出字符串 a*2 输出结果:HelloHello [] 通过索引获取字符串中 ...

python2 python3区别

Python开发团队将在2020年1月1日停止对Python2.7的技术支持,但python2的库仍然比较强大(在 pip 官方下载源 pypi 搜索 Python2.7 和 Python3.5 的第 ...

python2&python3

1.Python3 使用 print 必须要以小括包裹打印内容,比如 print('hi')   Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi ...

python3 字符串属性(一)

python3 字符串属性 >>> a='hello world' >>> dir(a) ['__add__', '__class__', '__contains_ ...

从python2,python3编码问题引伸出的通用编码原理解释

今天使用python2编码时遇到这样一条异常UnicodeDecodeError: ‘ascii’ code can’t decode byte 0xef 发现是编码问题,但是平常在python3中几 ...

(十四)Python3 字符串格式化

Python3 字符串格式化 字符串的格式化方法分为两种,分别为占位符(%)和format方式.占位符方式在Python2.x中用的比较广泛,随着Python3.x的使用越来越广,format方式使用 ...

python2 python3区别(续)

1.除法 Python2 Python3 int/int → int int/int → float python2下整数除以整数返回整数类型,python3下整数除以整数返回浮点数类型 当某些语句假 ...