问题标签 [python-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 可能的内存泄漏
有人可以检查是否存在内存泄漏吗?我很困惑。
python - 如何构建 Python C 扩展,以便我可以从模块中导入它
我有一个包含许多子模块的 Python 项目,这些子模块是用 distutils 打包的。我想在 C 中构建一些 Python 扩展以存在于其中一些子模块中,但我不明白如何让 Python 扩展存在于子模块中。以下是我正在寻找的最简单的示例:
这是我的 Python 扩展c_extension.c
:
这是一个setup.py
有效的方法:
在 virtualenv 中安装后,我可以这样做:
但我想c_extension
住在一个子模块中,比如说foo.bar
。我需要在此管道中进行哪些更改才能使 Python shell 中的行为如下所示:
python - 更正扩展模块中的循环垃圾收集
Python 2.7 文档的两个部分提到为扩展模块中定义的容器对象添加循环垃圾收集(CGC) 支持。
Python/C API参考手册给出了两条规则,即,
- 必须使用
PyObject_GC_New()
或分配对象的内存PyObject_GC_NewVar()
。- 一旦所有可能包含对其他容器的引用的字段都被初始化,它必须调用
PyObject_GC_Track()
.
而在Extending and Embedding the Python Interpreter中,Noddy
例如,添加Py_TPFLAGS_HAVE_GC
标志和填充tp_traverse
和tp_clear
插槽似乎足以启用 CGC 支持。上面的两条规则根本没有被实践过。
当我修改Noddy
示例以实际遵循PyObject_GC_New()
/PyObject_GC_Del()
和PyObject_Track()
/的规则时PyObject_GC_UnTrack()
,它出人意料地提出了断言错误说,
Modules/gcmodule.c:348: visit_decref: 断言“gc->gc.gc_refs != 0”失败。引用计数太小
这导致我对实施 CGC 的正确/安全方式感到困惑。任何人都可以提供建议,或者最好是一个具有 CGC 支持的容器对象的简洁示例吗?
c++ - 扩展通过 Boost.Python 公开的虚拟 C++ 类
我正在尝试使用 Boost.Python 公开这个 C++ 类:
我的最终目标是在 python shell 中将 VALgorithm 的子级定义为 python 类。按照这个例子,我定义了一个回调类:
现在我只公开类本身和 GetName() 方法。由于它是一个虚拟类,我将这段代码放在 BOOST_PYTHON_MODULE 中:
我可以编译它并将模块加载到 python shell 中。然后我尝试定义一个子类并调用 C++ 代码中定义的 GetName() 默认实现:
我不是专家(只是第一次遇到这些问题),但在我看来,ConcAlg1 和 ConcAlg3 尝试实例化一个 VAlgorithm 对象并由于公开 VAlgorithm 时使用的 no_init 参数而失败(我不能省略它或代码不会编译),并且 ConcAlg2 不能调用 GetName() ,因为它不被识别为 VAlgorithm 的子代。我一定是做错了什么,但我不知道是什么(我是 Boost.Python 和扩展的新手)。谁能帮帮我吗?谢谢
python - Python中的面向方面编程(AOP)
可能重复:
Python 的任何 AOP 支持库?
我熟悉AspectJ
Java 语言的扩展。
我想知道Python是否有这样的东西。
不要误会我的意思,我不是指库,而是像AspectJ
Java 这样的语言扩展。
python - 为什么在安装 simplejson 时出现“无法编译 C 扩展”?
顺便说一句,我使用的是 Windows,所以我必须安装 Visual Studio 吗?
警告:无法编译 C 扩展,未启用加速。
python - 为什么我在构建 python 时构建 sqlite3 失败?
为什么我只是未能构建 sqlite?
它与 readline 或 _tkinter 或其他什么有关吗?
未能构建这些模块:
_sqlite3
更多细节:
我的系统是centos 5.3
python - 避免在具有嵌入式 Python + C 扩展的应用程序中重复 msvcr90.dll?
我正在分发一个嵌入 Python 2.7 的 Windows 应用程序(技术:包括带有 DLL 和 Lib 文件夹的 python27.dll + 'Python27' 目录,以及我的 .exe)。我还包括一个使用 C 扩展(基本上是 DLL 的 .pyd 文件)的自定义 Python 包。
我知道我需要有版本 9.0.21022.8 的 msvcr90.dll 和相关的清单。我可以将 msvcr90.dll + manifest 放在我的 .exe 文件旁边,我可以正常工作,没有问题。但是为了使用我的自定义 Python 包,我发现我还需要在与包的 .pyd 文件相同的级别包含 msvcr90.dll + manifest(如果它们不存在,则应用程序在 PyImport_ImportModule 期间崩溃)。我不明白为什么 .pyds 无法“看到”位于树上方的 msvcr90.dll。
我知道我可以(可能)通过在目标机器上运行 MS Visual C Redistributable 包来绕过这个......这实际上安装了 MSVCR DLL + 清单,因此它在系统范围内可用。但是我不想要求我的用户运行它,也不想尝试将其安装在正确的位置并自己处理版本控制等。
python - Python C 扩展:返回 PyFloat_FromDouble(double) 段错误
我最近将一些慢速 python 代码转换为 C 扩展。它工作得很好,除了它在第 162 次调用时生成段错误,就在 return 语句处。
这是它的工作原理。有一次,在对要计算的函数的所有调用之前,我将数据加载到内存中(记住 INCREF 父对象):
(有关 C 数组方法,请参阅http://www.scipy.org/Cookbook/C_Extensions/NumPy_arrays )。然后我在我将从 python 调用的函数中引用加载的 double[][], DOSAGES:
通过大量调试语句(如您所见),我已将段错误本地化为 return 语句。也就是说,在 python 浮点对象的实例化之后,但是在从 C 调用 return 和 python 的下一个执行行之间的某个位置(你猜对了,一个 print("debugReturned")。我在 stdout 中看到的是:
所以 double 不是一个奇怪的值,python 对象是正确创建的,它不是 NULL,但是从 C 返回和在 python 中继续之间存在一些错误。在线资料表明这可能是一个 INCREF/DECREF 问题,但也指出 PyFloat_FromDouble() 和 Py_BuildValue("f",double) 会生成新的引用,因此不需要进行 INCREF。两种选择都会产生相同的结果。虽然我有理由确定我需要在我的 grm_loadDosage 函数期间对持有我的矩阵的 PyObject 进行 INCREF,但我已经尝试了使用和不使用 INCREF 的情况,其行为相同。
有什么想法吗?
谢谢
此外,堆栈跟踪:
python - PyArg_ParseTuple 的正确用法是什么
我使用的似乎是 PyArg_ParseTuple 的确切用法,但代码仍然无法工作。我正在使用 python 2.7
这是我正在编写的 Python 扩展的 C 代码:
然后我只是构建扩展并转到终端 import et 然后 et.tpp([1,2]) 无法打印该行 if (PyArg_ParseTuple(item, "i", &arrayValue) != 0){ printf(" %d\n", 数组值); printf("万岁!\n"); }
正如您在代码中看到的那样,我检查了列表中元素的类型,并打印了“int”。然而由于某种原因 PyArg_ParseTuple 有错误。
我需要能够从 python 中的列表中访问信息以复制一些数据,将其传递给其他地方的 C 代码,然后将结果返回给 python。
非常感谢!