【发布时间】:2020-09-12 12:21:52
【问题描述】:
我最近才开始使用cppyy 和ctypes,所以这可能是一个有点愚蠢的问题。我有以下 C++ 函数:
float method(const char* args[]) {
...
}
在 Python 中,我想将 args 作为字符串列表传递,即:
args = *magic*
x = cppyy.gbl.method(args)
之前找过this,所以用了
def setParameters(strParamList):
numParams = len(strParamList)
strArrayType = ct.c_char_p * numParams
strArray = strArrayType()
for i, param in enumerate(strParamList):
strArray[i] = param
lib.SetParams(numParams, strArray)
来自 Python:
args = setParameters([b'hello', b'world'])
c_types.c_char_p 需要一个字节数组。但是,当调用x = cppyy.gbl.method(args) 时,我得到了
TypeError: could not convert argument 1 (could not convert argument to buffer or nullptr)
我不完全确定为什么这是错误的,因为 args 是 <__main__.c_char_p_Array_2> 对象,我认为应该将其转换为 const char* args[]。
【问题讨论】:
-
为什么这个问题被标记为“c++”?很明显它是 C(不是很好的 C)。
-
方法来自外部.cpp文件
-
@JesperJuhl 不,不是。问题中的代码可以是有效的 C 或 C++。为了让它成为“非常清楚的 C”,它必须在 C++ 中做一些非法的事情,比如将
void *转换为其他类型的指针而不进行强制转换。 -
@Joseph 好的,很公平。但是你必须告诉我,这显然是用一种非常 C 风格的方式编写的,而不是你用现代 C++ 来处理它的方式。对吧?
-
@JesperJuhl 你的意思是使用
std::vector<std::string>之类的东西作为参数类型?通常我同意你应该在 C++ 中这样做,但这样做不会使通过 FFI 使用变得更加困难,这正是这里的用例?
标签: python c++ arrays string ctypes