标签: python-extensions

Python扩展调试

我正在尝试调试我在C中编写的python扩展模块.我使用以下代码编译它:

python setup.py build -g install --user
Run Code Online (Sandbox Code Playgroud)

然后我调试:

gdb python
...
b py_node_make
run test.py
Run Code Online (Sandbox Code Playgroud)

它在py_node_make(我定义的一个函数)中断,但后来我尝试:

(gdb) print node
No symbol "node" in current context.
Run Code Online (Sandbox Code Playgroud)

我正在尝试调试的功能是:

static Python_node_t* py_node_make(
        node_t* node)
{
    Python_node_t* pyNode;

    pyNode = PyObject_New(Python_node_t, &t_node);
    pyNode->node = node;
    pyNode->borrowed = true;

    return pyNode;
}
Run Code Online (Sandbox Code Playgroud)

python gdb debug-symbols python-extensions

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

在 C 扩展中定义 Python 枚举 - 我这样做对吗?

我正在开发一个 Python C 扩展,我想公开一个完全在 C 中定义的自定义枚举(如:继承自 enum.Enum 的类)。

事实证明这不是一个微不足道的任务,并且继承使用的常规机制.tp_base不起作用 - 很可能是由于 Enum 的元类没有被引入。

基本上我正在尝试这样做:

import enum

class FooBar(enum.Enum):
    FOO = 1
    BAR = 2
Run Code Online (Sandbox Code Playgroud)

在C.

经过大量深入研究 cpython 的内部结构后,这就是我想到的,包装在一个示例可构建模块中:

#include <Python.h>

PyDoc_STRVAR(module_doc,
"C extension module defining a class inheriting from enum.Enum.");

static PyModuleDef module_def = {
    PyModuleDef_HEAD_INIT,
    .m_name = "pycenum",
    .m_doc = module_doc,
    .m_size = -1,
};

struct enum_descr {
    const char *name;
    long value;
};

static const struct enum_descr foobar_descr[] = {
    {
        .name = "FOO",
        .value = …
Run Code Online (Sandbox Code Playgroud)

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

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

如何构建和分发依赖于第三方libFoo.so的Python/Cython包

我编写了一个依赖于某些C扩展的Python模块.这些C扩展依赖于几个已编译的C库.我希望能够分发与所有依赖项捆绑在一起的这个模块.

我把一个最小的例子放在一起(它可以在GitHub上找到它的全部内容).

目录结构是:

$ tree .
.
??? README.md
??? poc
?   ??? __init__.py
?   ??? cython_extensions
?   ?   ??? __init__.py
?   ?   ??? cvRoberts_dns.c
?   ?   ??? cvRoberts_dns.h
?   ?   ??? helloworld.c
?   ?   ??? helloworld.pxd
?   ?   ??? helloworld.pyx
?   ?   ??? test.c
?   ?   ??? test.h
?   ??? do_stuff.c
?   ??? do_stuff.pyx
??? setup.py
Run Code Online (Sandbox Code Playgroud)

setup.py构建扩展和对必需的库链接(libsundials_cvode,libsundials_nvectorserial在这种情况下):

from setuptools import setup, find_packages
from setuptools.extension import Extension
from Cython.Build import cythonize


ext_module_dostuff = Extension( …
Run Code Online (Sandbox Code Playgroud)

python setuptools python-extensions python-packaging

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

在Windows上使用f2py构建64位Python扩展

我正在尝试使用Numpy的f2py.py脚本从Fortran源构建Python扩展.我正在按照http://www.scipy.org/F2PY_Windows(网络存档)中的步骤操作.我的系统是Windows 7 64位,我主要使用Python 2.7.3 [MSC v.1500 64位(AMD64)].我有Numpy-MKL 1.7.1,来自http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

这是我尝试过的:

  1. 选择Fortran编译器.由于我使用的是64位Python,因此需要64位Fortran编译器.从MinGW-w64开始,我尝试了一些个人版本.
  2. 打开一个新cmd.exeshell,并编辑我解压缩GCC编译器的路径,即:
    • set PATH=%PATH%;c:\gnu\mingw64\bin
    • set C_INCLUDE_PATH=C:\gnu\mingw64\include
  3. f2py.py使用此命令尝试构建:

    C:\Python27\python.exe C:\Python27\Scripts\f2py.py -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr90 -m foo foo.f90

输出是(去除噪声线<--snip-->):

running build
<--snip-->
Reading fortran codes...
        Reading file 'foo.f90' (format:free)
Post-processing...
        Block: foo
                        Block: hello
Post-processing (stage 2)...
Building modules...
        Building module "foo"...
                Constructing wrapper function "hello"...
                  hello()
        Wrote C/API module "foo" to file "c:\users\mtoews\appdata\local\temp\tmpjr6qop\src.win-amd64-2.7\foomodule.c"
  adding 'c:\users\mtoews\appdata\local\temp\tmpjr6qop\src.win-amd64-2.7\fortranobject.c' to sources.
  adding …
Run Code Online (Sandbox Code Playgroud)

mingw numpy f2py python-extensions mingw-w64

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

如何在Python C扩展中为__init__指定docstring

也许是一个愚蠢的问题:如何__init__在编写C扩展时为特殊函数指定docstring ?对于普通方法,方法表提供了文档字符串.当我尝试帮助时,会显示以下自动生成的文档(myclass):

  __init__(...)
      x.__init__(...) initializes x; see help(type(x)) for signature
Run Code Online (Sandbox Code Playgroud)

但这是我想要覆盖的.

python docstring python-c-api python-extensions

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

当类实现PEP 3118时,Python 2.7中PyBufferProcs的定义

我正在扩展我们的库(支持Python 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.

从文档中,我需要初始化tp_as_buffer字段以指向a PyBufferProcs.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是 PyBufferProcs对新协议(一些其他的项目bf_getbufferbf_releasebuffer).

问题仍然存在:

  • 我是否必须做一些特别的事情来告诉Python这些新条目是否有效?

  • 我是否必须填写旧协议的条目?(例如,2.7的文档说明bf_getsegcount 可能不为空.但如果我支持PEP 3118,则不应使用此条目.)

python python-c-api pybuffer python-extensions pep3118

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

Py_BuildValue:用bool制作元组?

我在docs中看到,我可以使用int(指定'i')构建元组值.我需要用bool制作元组,例如(True, 10).如何用bool制作这样的元组(需要什么说明符)?

python python-extensions

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

如何将 python.h 放入 Mac OSX 上的 python virtualenv 中?

我正在为 python 应用程序编写 C 扩展,并且需要测试特定于 python 的 C 代码。为此,我需要将 Python.h 导入到我的 C 文件中,但我一生都无法做到这一点。大多数教程都建议使用 sudo apt-get python-dev ,但我的系统没有 apt-get,即使有,我认为最好将 dev 文件放在我的 virtualenv 中。

知道如何将 Python.h 放入我的 virtualenv 中吗?

c python python-extensions

9
推荐指数
2
解决办法
9110
查看次数

如何在Python扩展上处理uint8_t?

我想在我的C模块中传递一个函数的参数uint8_t的数组.

我找不到直接解析这个数组的方法,所以我将它解析为PyObject_t然后迭代为PyTuple_t对象.这样,我需要将此元组的每个元素PyObject_t转换为uint8_t.

一旦没有PyInt_FromUINT8_t函数或类似函数,我怎么能这样做呢?

python python-extensions uint8t

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

如何编写一个带有int或float的C函数?

我想在C中创建一个扩展Python的函数,它可以接受float或int类型的输入.所以基本上,我想要f(5)并且f(5.5)是可接受的输入.

我不认为我可以使用,if (!PyArg_ParseTuple(args, "i", $value))因为它只需要int或只浮动.

如何使我的函数允许输入为int或float?

我想知道我是否应该只接受输入并将其放入PyObject并以某种方式采用PyObject的类型 - 这是正确的方法吗?

c python python-extensions

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