共享库。C++ 与 Python

Shared Library. C++ with Python

提问人:unknown-889 提问时间:11/4/2023 最后编辑:Mark Tolonenunknown-889 更新时间:11/5/2023 访问量:42

问:

为什么我会遇到分段错误。

我想因为我使用的是字符串,但是我可以解决这个问题吗?

简单的代码,例如

#include <iostream>
#include <string>
struct Person {
    int age;
    std::string firstName;
    std::string lastName;
    std::string phoneNumber;
};
extern "C" {
    Person* getPerson() {
        Person person = Person();
        person.age = 25;
        person.firstName = "John";
        person.lastName = "Doe";
        person.phoneNumber = "123456789";
        return new Person(person);
    }
    void deletePerson(Person* person) {
        delete person;
    }
}
from ctypes import cdll, Structure, c_char_p, c_int
person_lib = cdll.LoadLibrary('./lib.so')
class Person(Structure):
    _fields_ = [
        ('age', c_int),
        ('firstName', c_char_p),
        ('lastName', c_char_p),
        ('phoneNumber', c_char_p)
    ]
person_lib.getPerson.restype = Person
person_lib.deletePerson.argtypes = [Person]
person = person_lib.getPerson()
info = f"Name: {person.firstName} {person.lastName}\nAge: {person.age}\nPhone: {person.phoneNumber}"
print(info)
person_lib.deletePerson(person)

希望从 c++ 库中获取一些信息并在 python 中使用它

python c++ 共享库 ctypes

评论

0赞 Darius 11/4/2023
可能是因为不是,而是.docs.python.org/3/library/ctypes.htmlc_char_pstd::stringchar* (NUL terminated)
0赞 unknown-889 11/4/2023
我是 c++ 的新手。你能解释一下如何解决这个问题吗?
0赞 Darius 11/4/2023
您可以通过将 的 更改为 来验证这是否是问题所在。Personstd::stringconst char*
0赞 James Kanze 11/4/2023
@Darius 这可能会导致对象的某些生存期问题;我真的不知道如何处理这个问题。就个人而言:Python 有一个 C ABI,我会使用它。(它有点冗长,但一点也不难使用。ctypes
0赞 Darius 11/4/2023
@JamesKanze 当然,我的建议是验证这是否是分段错误的原因。

答: 暂无答案