如何将 Python 字符串传递给 C++(外部 C)函数

Posted

技术标签:

【中文标题】如何将 Python 字符串传递给 C++(外部 C)函数【英文标题】:How to pass Python string to C++ (extern C) function 【发布时间】:2020-06-13 10:00:20 【问题描述】:

我有 q.cpp

#include <string>
#include <iostream>

extern "C" 

int isNExist (std::string* sequence) 
    std::cout << sequence << std::endl;
    // here I want to process input string and return some int value
    return 0;



q.py

from ctypes import cdll, c_char_p, c_int

lib = cdll.LoadLibrary('mylib.so')

lib.isNExist.restype = c_int
lib.isNExist.argtypes = [c_char_p]
string = "Hello world!".encode("UTF-8")
lib.isNExist(string)

打开命令:

g++ -c -fPIC q.cpp -o q.o
g++ -shared -Wl,-soname,mylib.so -o mylib.so  q.o

当我运行(32 位)python q.py 时,它返回一个错误:

Traceback (most recent call last):
File "q.py", line 27, in <module>
print(lib.isNExist(string))
OSError: exception: access violation reading 0x43544741

我应该如何正确地将值传递给 C++(在这种情况下是 C,因为我使用 extern C)函数来使用它?

编辑:

我稍微编辑了我的代码并尝试使用 char 而不是 string:

q.cpp:

#include <string>
#include <iostream>

extern "C" 

int isNExist (char* sequence) 
    std::cout << sequence << std::endl;
    return 0;



q.py

from ctypes import cdll, c_char_p, c_char, c_float, c_int,c_wchar_p, POINTER

lib = cdll.LoadLibrary('mylib.so')


# send strings to c function
lib.isNExist.argtypes = [POINTER(c_char_p)]
lib.isNExist.restype = c_int
s = "Hello world!".encode("UTF-8")
string_length = len(s)
string_type = c_char_p*string_length
#print(string_type)
result = lib.isNExist(string_type(*s))

它只传递并打印第一个字符('H'),但我想传递完整的字符串。我该怎么办?

编辑 2:

在 cpp 中,如果我在 isNEsixt 函数中传递字符串,它将正确打印整个字符串,string_type&lt;class '__main__.c_char_p_Array_12'&gt;,所以我假设我在 Python 代码的结果行中遗漏了一些东西

【问题讨论】:

【参考方案1】:

q.cpp 文件应该保持在我的示例中。注释是用python代码写的

#include <string>
#include <iostream>

extern "C" 

int isNExist (char* sequence) 
    std::cout << sequence << std::endl;
    return 0;

q.py

from ctypes import cdll, c_char_p, c_char, c_float, c_int,c_wchar_p,addressof, create_string_buffer,POINTER

# connect to .so
lib = cdll.LoadLibrary('mylib.so')

# set data types of arguments of cpp function
lib.isNExist.argtypes = [c_char_p]

# set result data type
lib.isNExist.restype = c_int

# string I want to pass to the function
s = "Hello world!".encode("UTF-8")

# create buffer that will pass my string to cpp function
buff = create_string_buffer(s)

# passing buff to function
result = lib.isNExist(buff)

【讨论】:

以上是关于如何将 Python 字符串传递给 C++(外部 C)函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从python传递给c++并返回?

具有外部 C++ 函数的 Matlab:coder.ceval 将结构传递给函数

在 C++ 中嵌入 Python。传递接收列表列表的字符串向量

如何将数组从 c++ 传递给 python 函数并将 python 返回的数组检索到 c++

如何通过 Python/C API 将 Python 实例传递给 C++

如何将 3D Python 列表传递给 C++ 程序