Python ctypes:使用'const char **'参数传递给函数

时间:2011-02-24 11:28:28

标签: python c ctypes

我想将一个字符串的python列表传递给期望const char **的C函数。我看到了问题和解决方案here,但它似乎对我不起作用。以下示例代码:

argList = ['abc','def']
options = (ctypes.c_char_p * len(argList))()
options[:] = argList

给出以下错误:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: string or integer address expected instead of str instance

我做错了什么?


附录:

似乎已达成共识,即此代码应该有效。以下是如何重现问题。

我的Python命令行中输入的以下四行说明了我的问题。

Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> argList = ['abc', 'def']
>>> options = (c_char_p * len(argList))()
>>> options[:] = argList
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string or integer address expected instead of str instance
>>>

2 个答案:

答案 0 :(得分:3)

要考虑的另一种语法:

>>> from ctypes import *
>>> a = 'abc def ghi'.split()
>>> b=(c_char_p * len(a))(*a)
>>> b[0]
'abc'
>>> b[1]
'def'
>>> b[2]
'ghi'

适用于我的2.7.1和3.1.3安装。如果数组是一个字节实例,而不是str实例:

,则工作于3.2
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> a = b'abc def ghi'.split()
>>> b=(c_char_p * len(a))(*a)
>>> b[0]
b'abc'
>>> b[1]
b'def'
>>> b[2]
b'ghi'

看起来3.2之前允许从str(Unicode)到字节的强制。这可能不是一个错误,因为3.X系列试图消除字节的自动转换&lt; - &gt; str(显式优于隐式)。

答案 1 :(得分:1)

示例python代码是正确的。

可以粘贴整个代码吗?

在这种情况下,我猜你的字符串包含嵌入的NUL字节,并抛出此TypeError异常。

希望此链接有所帮助:http://docs.python.org/c-api/arg.html