我正在尝试调试我在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 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模块.这些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) 我正在尝试使用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
这是我尝试过的:
cmd.exeshell,并编辑我解压缩GCC编译器的路径,即:
set PATH=%PATH%;c:\gnu\mingw64\binset C_INCLUDE_PATH=C:\gnu\mingw64\includef2py.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) 也许是一个愚蠢的问题:如何__init__在编写C扩展时为特殊函数指定docstring ?对于普通方法,方法表提供了文档字符串.当我尝试帮助时,会显示以下自动生成的文档(myclass):
__init__(...)
x.__init__(...) initializes x; see help(type(x)) for signature
Run Code Online (Sandbox Code Playgroud)
但这是我想要覆盖的.
我正在扩展我们的库(支持Python 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.
从文档中,我需要初始化tp_as_buffer字段以指向a PyBufferProcs.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是
PyBufferProcs对新协议(一些其他的项目bf_getbuffer和bf_releasebuffer).
问题仍然存在:
我是否必须做一些特别的事情来告诉Python这些新条目是否有效?
我是否必须填写旧协议的条目?(例如,2.7的文档说明bf_getsegcount
可能不为空.但如果我支持PEP 3118,则不应使用此条目.)
我在docs中看到,我可以使用int(指定'i')构建元组值.我需要用bool制作元组,例如(True, 10).如何用bool制作这样的元组(需要什么说明符)?
我正在为 python 应用程序编写 C 扩展,并且需要测试特定于 python 的 C 代码。为此,我需要将 Python.h 导入到我的 C 文件中,但我一生都无法做到这一点。大多数教程都建议使用 sudo apt-get python-dev ,但我的系统没有 apt-get,即使有,我认为最好将 dev 文件放在我的 virtualenv 中。
知道如何将 Python.h 放入我的 virtualenv 中吗?
我想在我的C模块中传递一个函数的参数uint8_t的数组.
我找不到直接解析这个数组的方法,所以我将它解析为PyObject_t然后迭代为PyTuple_t对象.这样,我需要将此元组的每个元素PyObject_t转换为uint8_t.
一旦没有PyInt_FromUINT8_t函数或类似函数,我怎么能这样做呢?
我想在C中创建一个扩展Python的函数,它可以接受float或int类型的输入.所以基本上,我想要f(5)并且f(5.5)是可接受的输入.
我不认为我可以使用,if (!PyArg_ParseTuple(args, "i", $value))因为它只需要int或只浮动.
如何使我的函数允许输入为int或float?
我想知道我是否应该只接受输入并将其放入PyObject并以某种方式采用PyObject的类型 - 这是正确的方法吗?
python ×9
c ×3
python-c-api ×3
docstring ×1
f2py ×1
gdb ×1
mingw ×1
mingw-w64 ×1
numpy ×1
pep3118 ×1
pybuffer ×1
python-3.x ×1
setuptools ×1
uint8t ×1