Python中如何给C函数传递JSON字符串?

调用的都是同一个 C 函数,python 用的 ctypes

// c 语言中调用是这样
Init("{\"a\":\"../../av\", \"b\":\"../../bv\"}")
#如果用 python 调用 init 函数时,应该传递啥样的 json 字符串?这样不行😂,提示 expected key string
Init('{"a": "../av", "b": "../bv"}')

Python中如何给C函数传递JSON字符串?

11 回复

…你先确认下你 python 版本,c 默认接受是 char*的话,ctypes 传的参数必须是 bytes


在Python里给C函数传JSON字符串,最直接的办法就是用ctypes。你得先把JSON转成C能认的字符串(c_char_p),调完C函数后再把返回的C字符串转回Python的。下面是个完整例子:

假设你有个C库函数,声明是 char* process_json(const char* json_str)

import ctypes
import json

# 1. 加载C库
lib = ctypes.CDLL('./your_lib.so')  # Linux/Mac
# lib = ctypes.CDLL('your_lib.dll')  # Windows

# 2. 定义函数参数和返回类型
lib.process_json.argtypes = [ctypes.c_char_p]
lib.process_json.restype = ctypes.c_char_p

# 3. 准备JSON数据
data = {"name": "test", "value": 42}
json_str = json.dumps(data)  # Python字符串

# 4. 调用C函数
# 需要把Python字符串编码成bytes
result_ptr = lib.process_json(json_str.encode('utf-8'))

# 5. 处理返回结果
if result_ptr:
    result_str = result_ptr.decode('utf-8')
    print("C函数返回:", result_str)
else:
    print("C函数返回了空指针")

关键就两步:一是用json.dumps()把Python对象转成JSON字符串,然后.encode('utf-8')变成bytes传给C;二是C返回的c_char_p要用.decode('utf-8')转回Python字符串。

如果C函数要修改传入的字符串,记得用create_string_buffer分配可写内存。另外确保C那边用malloc分配的内存,Python这边能正确释放。

简单说就是:JSON转字符串再编码,调C函数后解码拿结果。

你把 c 的函数接口类型确定了
Init ( char *x )

然后 python 里

s="{“a”:"…/…/av", “b”:"…/…/bv"}"

.Init ( s )

试试 Init(’{“a”: “…/av”, “b”: “…/bv”}’.encode())
如果可以的话把完整代码发上来吧。

这样肯定不行啊,语法都是错误,python 双引号中,不能再用双引号啊

忽略 4 楼我说的,这样是不行的,就是我主帖里边的报的错:expected key string

很棒,这样是可行的👍👍👍👍

忘记了,应该可以更简单,试试
Init(b’{“a”: “…/av”, “b”: “…/bv”}’)

👍👍👍👍👍👍👍👍👍👍👍👍也可以,多谢,顺便再问一下,假如 C 函数返回一个句柄,用 python 调用这个函数的时候,应该怎么拿这个句柄呢?

什么句柄?发代码看看?

摸索了下,搞定啦,多谢了😁

回到顶部