我很抱歉,但我一般也很難讀取當前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