gpt4 book ai didi

c++ - Cython - 共享 Cython 模块

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:08 24 4
gpt4 key购买 nike

我有 cython 模块 base.pyx 和 derived.pyx。 base.pyx 及其导入定义 base.pxd 文件使用 cimportderived.pyx 文件中定义和使用>。文件放置在here .

在我的 Python 应用程序中使用从 cython 生成的共享对象时,模块被正确导入,但是在使用库时总是出现错误提示 ImportError: No module named 'base'在 Cpp 应用程序中。

我还在我的Cpp应用程序中添加了当前路径

  PyObject* path = PySys_GetObject("path");
PyObject* result = PyObject_CallMethod(path,"append","(s)",".");
Py_XDECREF(result);

即使这样,cython 模块对应用程序也是不可见的。请让我知道这种路径不匹配的可能原因。

最佳答案

这里的部分混淆是关于 cimport 的行为。 - OP 试图使用文件 derived.pyxcimport编辑base.pyx并试图从 C++ 中做到这一点。

cimport做两件事:

  1. 它允许 Cython 知道 cdef在另一个 .pyx 中定义的函数或 .pxd文件,以便它可以访问这些功能。这发生在编译时。
  2. import是那个模块。这发生在运行时,可以通过检查生成的 C 代码看到。 import是“import ant”有两个原因:

    1. base.pyx中使用的函数可能需要在 base 中初始化全局变量或类,这是在导入时完成的。

    2. 它会导致 base共享对象被物理加载到内存中,并将一些函数指针(在 derived 中)初始化为 cdefbase 中发挥作用.

    请注意 import看起来并没有实际添加 basederived的模块字典,所以它与 Python 导入不太一样。

我相信让 OP 感到困惑的部分原因是这有点出乎意料 import .


第二个问题是在提问时才发现的,因为它涉及到问题中没有写的关键细节。我设法让代码按照提供的方式工作:

python3 setup.py build_ext --inplace
g++ test.cpp -o test `python3-config --libs --includes` ./derived.cpython-36m-x86_64-linux-gnu.so
./test

(第二行可能需要更改以匹配已编译派生模块的确切名称)。 @PierredeBuyl 做了一些稍微不同的事情,但同样发现代码无需更改即可工作。

问题实际上是 OP 正在重命名 derived.cpython-36m-x86_64-linux-gnu.sobase.cpython-36m-x86_64-linux-gnu.solibderived.solibbase.so .这不是 derived 的问题直接与 test 链接程序,但意味着 Python 导入机制找不到 base (因为它已重命名)。


发布为社区 wiki 是为了尽可能多地摆脱我自己的声誉,因为我认为这是一种共同努力,但解决方案有些不尽如人意。

关于c++ - Cython - 共享 Cython 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43764950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com