ctypes.ArgumentError:参数 1:<class 'TypeError'>:类型错误

问题描述 投票:0回答:1

我无法让 ctypes 正确解释 Python 字符串。 以下是重现错误的步骤:

  1. 创建文件shared.c:
#include <stdio.h>

void hello(char *name){
    printf("Hello");
}
  1. 创建文件loader.c
void hello(char *name);

void main(){
    hello(char *name);
}
  1. 生成共享文件并命名为test.so

    gcc -shared shared.c -o test.so

  2. 创建名为replicate_error.py的Python脚本:

import ctypes

lib_name = './test.so'
lib=ctypes.cdll.LoadLibrary(lib_name)
init_hello=lib.hello
init_hello.argtypes=[ctypes.c_char_p]
init_hello("Test")
  1. 运行Python脚本:
    python reproduce_error.py

第 5 步的完整回溯是:

Traceback (most recent call last):
  File "reproduce_error.py", line 8, in <module>
    init_hello('Test')
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

有谁知道为什么会出现此问题或可以提供一些有关如何解决此问题的建议吗?谢谢!

  1. 我尝试了这个使用 wintypes 的解决方案,但很快意识到这并不能推广到基于 Linux 的系统。我使用的是 Ubuntu 20.04。

  2. 在将字符串参数传递给函数 init_hello 之前,我尝试使用

    create_string_buffer
    为 utf-8 和 latin-1 创建一个字符串缓冲区。比如:

第4步修改:

import ctypes
from ctypes import c_bool

lib_name = './test.so'
lib=ctypes.cdll.LoadLibrary(lib_name)
init_hello=lib.hello
init_hello.argtypes=[ctypes.c_char_p]
init_hello.restype = c_bool
s = ctypes.create_string_buffer(lib_name.encode("utf-8"))
init_hello('Test')

但是效果并不好,我也遇到了同样的错误。

Python 中的字符串“Test”未被

ctypes.c_char_p
正确解释。因此,我希望找到Python和C之间正确的接口方式。

python ctypes
1个回答
0
投票

c_char_p
需要一个 byte 字符串。使用
b'Test'

© www.soinside.com 2019 - 2024. All rights reserved.