标签: python-c-api

PyArg_ParseTupleAndKeywords 抛出警告:ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

搜索有关如何使用PyArg_ParseTupleAndKeywords我发现这些问题的示例:

  1. 如何使用 PyArg_ParseTupleAndKeywords 解析带有可选参数和关键字的元组?
  2. PyArg_ParseTupleAndKeywords 如何工作?

他们都使用类似的东西 static char* kwlist[] = {"a", "b", NULL}

static int PyClass_init(PyClass* self, PyObject* args, PyObject* kwargs) {
    char* path;
    char* regex;
    static char* kwlist[] = {"", "", NULL};

    if( !PyArg_ParseTupleAndKeywords( args, kwargs, "s|s", kwlist, &path, &regex ) ) {
        return -1;
    }

    // other code ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

language = "c++"on编译setup.py它并用它构建它-std=c++11会抛出这个警告:

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O0 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC …
Run Code Online (Sandbox Code Playgroud)

c c++ python python-c-api c++11

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

Py_Initialize后导入模块

今天,我使用PyImport_AppendInittab追加C语言内置的python模块。PyImport_AppendInittab需要在之前调用Py_Initialize。我无法完成并再次初始化引擎。问题是现在我需要在Py_Initialize. 有办法做到吗?

我正在使用Python 3.6。

c python python-c-api python-3.x

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

为什么我的 Python 扩展类型有两个而不是一个引用计数?

我正在维护一个使用 Python C API 作为 Python 扩展构建的 Python 类型。我的问题是关于这个“NamedArray”对象的生命周期。基本上我的测试代码如下所示:

    def test_init_from_constructor(self):
        """

        :return:
        """
        n = NamedArray((2, 3))
        self.assertIsInstance(n, NamedArray)
        self.assertEqual(2, sys.getrefcount(n))
Run Code Online (Sandbox Code Playgroud)

我的问题是,新实例化的 NamedArray 对象的引用计数为 2,但我希望它为 1。另一个引用来自哪里?

c python refcounting python-c-api

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

Python C 扩展中的内存泄漏

这是我第一次为 python 编写 C 扩展,你可以看到我丑陋且可能超级低效的卷积 C++ 实现。我的内存管理有问题。每次我在 python 中调用这个函数时,它都会消耗大约 500MB 的内存(对于大小为 100x112x112x3 的批次和大小为 3x3x3x64 的内核),并且之后不会释放它。即使这不是类方法,我是否必须注意引用计数?或者我是否必须在代码中的某个位置手动释放内存?请注意,为了更好地概览,我排除了所有错误检查。谢谢。

PyObject* conv2d(PyObject*, PyObject* args)

{
    PyObject* data;
    PyObject* shape;
    PyObject* kernel;
    PyObject* k_shape;
    int stride;

    PyArg_ParseTuple(args, "OOOOi", &data, &shape, &kernel, &k_shape, &stride);

    Py_ssize_t dims = PyTuple_Size(shape);
    Py_ssize_t kernel_dims = PyTuple_Size(k_shape);

    int shape_c[3];
    int k_shape_c[4];

    for (int i = 0; i < kernel_dims; i++)
    {
        if (i < dims)
        {
            shape_c[i] = PyLong_AsLong(PyTuple_GetItem(shape, i));
        }
        k_shape_c[i] = PyLong_AsLong(PyTuple_GetItem(k_shape, i));
    }

    PyObject* data_item, kernel_item;
    PyObject* ret_array = …
Run Code Online (Sandbox Code Playgroud)

c python python-c-api

0
推荐指数
1
解决办法
1851
查看次数

标签 统计

c ×4

python ×4

python-c-api ×4

c++ ×1

c++11 ×1

python-3.x ×1

refcounting ×1