在Python中实现char-const*const-names[]的最佳方法是什么
我需要将“char const*const names[]”参数传递给C API。如何在python ctypes中获取指向常量字符的常量指针 我试着用 string1=“首先你好” name=ctypes.c_wchar_p(string1) 来自C的Api调用将是:在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[]={“AVeryLongName”,“Name”} 你应该先看看。两个想法:
- 您不能通过CTypes指定constness(或者至少,我不知道如何指定)。Win的一个小例子:
因此,数组的CTypes包装器与>>从ctypes导入wintypes >>>wintypes.LPCSTR==wintypes.LPSTR 真的
char*names[]=..
- 从Python3开始,(8位)字符序列(
)不再是str对象,而是一个str对象。它具有大多数常规字符串功能,但当您声明文字时,必须在其前面加上b:ctypes.c_char\u p
注意:要将常规字符串转换为字节,请使用:>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)