在Python中实现char-const*const-names[]的最佳方法是什么

在Python中实现char-const*const-names[]的最佳方法是什么,python,ctypes,Python,Ctypes,我需要将“char const*const names[]”参数传递给C API。如何在python ctypes中获取指向常量字符的常量指针 我试着用 string1=“首先你好” name=ctypes.c_wchar_p(string1) 来自C的Api调用将是: char const*const names[]={“AVeryLongName”,“Name”} 你应该先看看。两个想法: 您不能通过CTypes指定constness(或者至少,我不知道如何指定)。Win的一个小例子: >

我需要将“char const*const names[]”参数传递给C API。如何在python ctypes中获取指向常量字符的常量指针

我试着用 string1=“首先你好” name=ctypes.c_wchar_p(string1)

来自C的Api调用将是:
char const*const names[]={“AVeryLongName”,“Name”}

你应该先看看。两个想法:

  • 您不能通过CTypes指定constness(或者至少,我不知道如何指定)。Win的一个小例子:

    >>从ctypes导入wintypes
    >>>wintypes.LPCSTR==wintypes.LPSTR
    真的
    
    因此,数组的CTypes包装器与
    char*names[]=..

  • 从Python3开始,(8位)字符序列(
    ctypes.c_char\u p
    )不再是str对象,而是一个str对象。它具有大多数常规字符串功能,但当您声明文字时,必须在其前面加上b:

    >s=“一些字符串”
    >>>类型
    >>>b=b“一些字符串”
    >>>类型(b)
    
    注意:要将常规字符串转换为字节,请使用:
    “伪字符串”。encode()

  • 无法从Python中创建未大小的数组(char*);有两种变通方法:

  • 声明大小为的数组
  • 声明一个指针(类型:
    ctypes.pointer(ctypes.c\u char\p)

  • 让我们看一个关于#1.的简短示例:

    >>阵列尺寸=2
    >>>CharPArr=ctypes.c\u char\u p*数组\u DIM
    >>>查尔帕尔
    >>>Name=CharPArr(b“AVeryLongName”,“Name”.encode())
    >>>名称,名称[0],名称[1]
    (,b'AverlyLongName',b'Name')
    
    names对象(上面)可以传递给接受
    char const*const names[]
    的函数,尽管我不确定函数如何确定数组的长度(除非另一个参数保持其长度)

    更新#0 Python 2也是如此:

    >>阵列尺寸=2
    >>>CharPArr=ctypes.c\u char\u p*数组\u DIM
    >>>查尔帕尔
    >>>名称=CharPArr(“AVeryLongName”、“名称”)
    >>>名称,名称[0],名称[1]
    (,'AVeryLongName','Name')
    

这就是我最终实现的方式,它似乎与Python 2.7一起工作

示例C文件:

void sam_test(char const *const names[],int n)
{
 int i;
   for (i = 0; i < n; i++) {
     printf ("%s \n", (names[i]));
   }
}

谢谢你的回复。我将尝试使用Python 3。不客气:)让我知道它是如何工作的。我没有看到任何Python版本,所以我假设它是3。对于Python2,它更简单,因为您可以忽略第二个bullet.CristiFati,实际上,在一开始我尝试使用Python2。但一旦我弄明白了,我会更新我的解决方案。我不明白。什么解决方案?这不管用吗?最后,您使用的是Python2还是*3?我使用的是Python2,解决方案已经更新,非常感谢您提供了指向ctypes指针的指针:)
import ctypes
lib = ctypes.cdll['./test.so']
sam = lib['sam_test']
String = ctypes.c_char_p * 3
ii = String("First", "Second", "Third")
name = ctypes.cast(ii, ctypes.POINTER(ctypes.c_char_p))
sam(name, 3)