为什么使用 ctypes 从 C++ 运行函数会导致 Python 中的错误

Why run function from C++ using ctypes results in error in Python

提问人:lolka0d 提问时间:11/7/2023 最后编辑:lemlolka0d 更新时间:11/7/2023 访问量:72

问:

我在 ctypes 和 C++ 上有一个错误。当我尝试从weighty_functions.cpp运行函数时,出现错误:

  File "/home/user/PycharmProjects/Snake/main.py", line 6, in <module>
    print(weighty_functions.random_number_except_values(720, l))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ctypes/__init__.py", line 389, in __getattr__
    func = self.__getitem__(name)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ctypes/__init__.py", line 394, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: ./lib.so: undefined symbol: random_number_except_values

如何更改 main.py 或weighty_functions.cpp来解决这个问题?

weighty_functions.cpp

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int random_number_except_values(int to, vector<int> except_values) {
    vector<int> all_variants;
    int result;

    for (int i = 0; i < to; i++) {
        if (find(except_values.begin(), except_values.end(), i) == except_values.end()) {
            all_variants.push_back(i);
        }
    }
    
    srand(time(NULL));

    result = rand() % all_variants.size();

    return result;
}

int main() {
    return 1;
}

main.py

import ctypes
except_values = [1, 2, 3, 4]
weighty_functions = ctypes.CDLL("./lib.so")
except_values = (ctypes.c_int * len(except_values))(*except_values)
print(weighty_functions.random_number_except_values(720, except_values))
Python C++ ctypes

评论

1赞 Ulrich Eckhardt 11/7/2023
为什么 C++ 代码有一个 ?你如何编译它?此外,.so 中的符号名称与 C++ 函数的名称不同,有关详细信息,请参阅 C++ 名称修改。顺便说一句:我使用快速,非详尽的搜索找到的所有教程都使用C或定义了C++函数。这可能是有原因的。main()extern "C"
2赞 CristiFati 11/7/2023
此外,它是 C类型vector<int> 不是 C和 [SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值(@CristiFati的答案)。
0赞 n. m. could be an AI 11/7/2023
TL;DR ctypes 不起作用,请改用 pybind11。

答: 暂无答案