标签: extension-modules

C++ Python模块导入错误:"undefined symbol:Py_InitModule3"(Py_InitModule())

我刚开始尝试在C中编写我的第一个Python扩展模块,并使用https://www.tutorialspoint.com/python/python_further_extensions.htm中提供的说明.

我在Linux Mint 18.1上,在其virtualenv版本中使用Python 3.6.1.

作为第一步,我编写了一个非常简约的Python模块版本.

这是我的C代码:

include <Python.h>

static PyObject* uniqueCombinations(PyObject* self)
{
    return Py_BuildValue("s", "uniqueCombinations() return value (is of type 'string')");
}

static char uniqueCombinations_docs[] =
    "usage: uniqueCombinations(lstSortableItems, comboSize)\n";

static PyMethodDef uniqueCombinations_funcs[] = {
    {"uniqueCombinations", (PyCFunction)uniqueCombinations, 
     METH_NOARGS, uniqueCombinations_docs},
    {NULL}
};

void inituniqueCombinations(void)
{
    Py_InitModule3("uniqueCombinations", uniqueCombinations_funcs,
                   "Extension module uniqueCombinations v. 0.01");
}
Run Code Online (Sandbox Code Playgroud)

这里是我用来编译C代码的setup.py文件的代码 uniqueCombinations.cpython-36m-x86_64-linux-gnu.so:

from distutils.core import setup, Extension

setup(name='uniqueCombinations', version='0.01',  \
      ext_modules=[Extension('uniqueCombinations', ['uniqueCombinations_pythonCmodule_v-0.01_Cg.c'])])
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,导入时模块无法正确加载:

>>> import uniqueCombinations
Traceback (most recent call last):
  File "<stdin>", line …
Run Code Online (Sandbox Code Playgroud)

c++ python python-import extension-modules python-3.x

9
推荐指数
1
解决办法
4510
查看次数

在Python中,如何判断模块是否来自C扩展?

如果导入的模块来自C扩展而不是纯Python模块,那么从Python中判断出正确或最强大的方法是什么?这很有用,例如,如果Python包具有既包含纯Python实现又包含C实现的模块,并且您希望能够在运行时告知正在使用哪个模块.

一个想法是检查文件扩展名module.__file__,但我不确定应该检查所有文件扩展名,以及这种方法是否必须最可靠.

python python-c-extension extension-modules

8
推荐指数
2
解决办法
2527
查看次数

Boost Python中的交叉模块依赖关系

假设我有两个boost python模块,定义如下.模块A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    class_<SomeClass>("SomeClass");
}
Run Code Online (Sandbox Code Playgroud)

和模块B:

class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}
Run Code Online (Sandbox Code Playgroud)

模块B依赖于模块A(即它使用SomeClass模块A).现在,我执行以下python脚本:

import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
  File "C:\bladiebla\script.py", line 8, in <module>
    obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass) …
Run Code Online (Sandbox Code Playgroud)

c++ python boost extension-modules

7
推荐指数
2
解决办法
2196
查看次数

与java的继承相比,Groovy的扩展模块

groovy的扩展模块是java的继承功能的混合形式吗?为什么扩展模块需要声明为静态?

java groovy gdk extension-modules

6
推荐指数
1
解决办法
391
查看次数

DLL 加载失败:%1 不是有效的 win32 应用程序

所以我遇到一种情况,我需要制作二进制补丁,然后能够从 python 中应用它们。我发现bsdiff看起来是一个很棒的算法,并且有一个python 扩展模块,但是该扩展模块没有超过 Python 2.5 的 Windows 安装程序

好吧,我什至从未认真编写过 C,更不用说尝试使用 python 扩展模块了,所以我开始自己编译它。在用 MinGW32 解决 DLL 加载错误几个小时后,我设法使用项目源代码中提供的 setup.py 对其进行编译和构建。但是,在导入生成的 bsdiff 模块后,我得到:

ImportError: DLL load failed: %1 is not a valid Win32 application.

我正在运行 64 位 python。

有什么建议吗?

c python extension-modules

5
推荐指数
1
解决办法
1万
查看次数

Python/pip:如何使用扩展模块进行可编辑包安装?

我正在开发一个带有 C++ 扩展模块的 python 包,该模块通过 pybind11 与 python 代码进行互操作,并且我正在使用 CMake 构建该包(基于答案)。

我已将软件包安装为可编辑,以帮助开发pip install -e .

我经常更新 C++ 扩展模块,每次这样做时,让我的更改生效的唯一方法是完全清理每个构建文件,卸载,然后重新安装包,这在很大程度上违背了拥有一个包的目的。用于开发目的的可编辑安装。

有没有一种方法可以使用扩展模块进行可编辑安装,以便我可以在对其进行更改时重建模块,而无需每次都清理并重新安装整个包?

python pip cmake extension-modules pybind11

5
推荐指数
0
解决办法
244
查看次数

如何导入或安装预构建的 python 扩展模块 (C++)(即不是通过 setuptools 编译的库)?

我有一个 C++ 项目,我正在为其开发 Python 接口。现在我正在使用pybind11因为它看起来很简洁,并且有一些很好的工具可以使用 CMake 构建扩展模块,这就是主要的 C++ 项目的构建方式。

通过 CMake 我设法获得了一个包含要构建的接口函数的共享库,但是现在我有了它我不知道如何告诉 Python 它存在并使其可导入。我不想重新配置要通过 Python 启动的整个项目构建(即如这里使用 setuptools 所述),因为它是一个大项目,我只是为它的一部分提供了一个 Python 接口。因此,如果我可以只为 Python 构建共享库以及其余的 C++ 代码,然后再运行“setup.py install”来执行其他任何需要使共享库可见的操作,那就更好了到 Python。

这可能吗?或者我是否需要进行一些其他类型的重构,例如让主项目构建一些其他纯 C++ 库,然后我只需将其链接到通过 setuptools 单独构建的 Python 扩展模块库?

c++ python setuptools extension-modules pybind11

3
推荐指数
1
解决办法
1329
查看次数