我很抱歉,但我一般也很难读取当前ctypes的文档......是否可以通过引用通过ctypes传递一个python字符串?
如果我有一个C函数,它接受一个const char *
指针,我知道它既不修改通过字符串,也不会在函数调用之外保留对它的引用,所以将指针直接传递给python字符串的字节是非常有意义的。
ctypes可以做到这一点,或者它只是普通的不支持?我真的必须create_string_buffer
并将我的字符串复制到它吗?
我很抱歉,但我一般也很难读取当前ctypes的文档......是否可以通过引用通过ctypes传递一个python字符串?
如果我有一个C函数,它接受一个const char *
指针,我知道它既不修改通过字符串,也不会在函数调用之外保留对它的引用,所以将指针直接传递给python字符串的字节是非常有意义的。
ctypes可以做到这一点,或者它只是普通的不支持?我真的必须create_string_buffer
并将我的字符串复制到它吗?
分配一个新值到指针类型c_char_p的实例,c_wchar_p和c_void_p改变它们指向,而不是存储器块的内容的存储器位置(当然不是,因为Python字符串是不可变的):
>>> s = "Hello, World"
>>> c_s = c_char_p(s)
>>> print c_s
c_char_p('Hello, World')
>>> c_s.value = "Hi, there"
>>> print c_s
c_char_p('Hi, there')
>>> print s # first string is unchanged
Hello, World
>>>
你应该小心,但是,不 期望传给 指向可变的内存功能。如果 需要可变内存块,ctypes具有 一个create_string_buffer函数,其中 以各种方式创建这些函数。该 当前内存块内容可以是 访问(或改变)与原 属性,如果要访问它 NUL结束的字符串,使用字符串 属性:
说ctypes的教程。我从这里收集到的是,只有当函数能够与const char*
一起工作时,才会传入python字符串才能生效。请记住,它不会有空终止。
无论如何,我建议使用create_string_buffer
。
类型ctypes.c_char_p表示一个nul结尾的字符串。如果一个函数接受一个const char *,你可以传递一个Python字符串给它,并且它会接收一个nul结尾的版本。
一个Windows DLL例如:
#include <string.h>
__declspec(dllexport) char* func(char* a,size_t len,const char* b)
{
if(strlen(b) * 2 >= len)
return NULL;
strcpy_s(a,len,b);
strcat_s(a,len,b);
return a;
}
的Python:
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> x=CDLL('x')
>>> x.func.restype=c_char_p
>>> x.func.argtypes=[c_char_p,c_int,c_char_p]
>>> s=create_string_buffer(10)
>>> x.func(s,len(s),'abcd')
'abcdabcd'
>>>
Python的文档说...“无论是整数,长整数,字节串还是unicode字符串都是唯一可以在这些函数调用中直接用作参数的本机Python对象...字节字符串和unicode字符串作为指针传递包含其数据的内存块(char *或wchar_t *)。“ ...在[调用函数](http://docs.python.org/2/library/ctypes.html#calling-functions)的部分中,就在[基础数据类型](http:// docs.python .org/2/library/ctypes.html#fundamental-data-types) – 2012-12-18 07:21:27
Python C API函数的Python文档[PyString_AsString](https://docs.python.org/2.7/c-api/string.html? highlight = pystring#c.PyString_AsString):*返回字符串内容的NUL终止表示。指针指向字符串的内部缓冲区,而不是副本*。内部字符串缓冲区以nul结尾。 – 2015-01-09 02:14:19
谢谢,你是完全正确的。我甚至隐约记得以前读过这个。我鄙视ctypes文档以将关键信息放在教程中。 – porgarmingduod 2011-04-07 09:07:57
我在那听到你。 Python文档非常棒,除非你需要查看某些东西。然后你需要阅读与你想要做的事有关的一切。 虽然我不能强调,但您所使用的字符串不会以null结尾。所以不要在它们上使用任何std :: string或string.h函数。 ) – bryanegr 2011-04-07 09:09:27
一个传递给ctypes *的Python字符串将会以nul结尾。将Python字符串传递给采用c_char_p类型的函数是有效的。 – 2011-04-12 04:42:05