问题标签 [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.

0 投票
1 回答
448 浏览

python - 我可以使用哪个工具(gdb?xcode?pdb?等)来查找 C 扩展 python 程序中的内存泄漏?

我正在编写一个 python 程序,其中包含一个用 C 编写的扩展模块。扩展模块定义了一个在我的程序中不断使用的函数。

我的程序某处有内存泄漏,但我不知道如何找到它。我试过 1) 安装 Valgrind。但是,由于我有 OSX Mavericks (10.9) 并且 Valgrind 仅支持 OXS 10.7(并且 10.8 有点不稳定),因此我无法使其正常工作。2) 使用 gdb。我似乎无法让 gdb 运行 python 脚本,因为我需要在从我的 python 代码调用的 c 函数中设置一个断点。我相信我需要安装 python-debuginfo 才能做到这一点,但我做不到。3) 使用 pdb。但是,我不知道如何使用 pdb 调试 c 代码。

有没有一个很好的工具可以用来调试我的程序中的内存泄漏?

0 投票
3 回答
3716 浏览

python - 如何在 Mac OSX 上将 python.h 放入我的 python virtualenv?

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

知道如何让 Python.h 进入我的 virtualenv 吗?

0 投票
1 回答
1727 浏览

python - tp_clear、tp_dealloc 和 tp_free 有什么区别?

我有一个用于模糊字符串搜索的自定义 python 模块,实现 Levenshtein 距离计算,它包含一个名为 levtree 的 python 类型,它有两个成员,一个指向执行所有计算的 wlevtree C 类型(称为树)的指针和一个指向的 PyObject* python 字符串的 python 列表,称为 wordlist。这是我需要的:

- 当我创建一个 levtree 的新实例时,我使用一个构造函数,它将字符串元组作为其唯一输入(并且它是实例将在其中执行所有搜索的字典),这个构造函数将必须创建一个新的实例wordlist 到 levtree 的新实例中,并将输入元组的内容复制到 wordlist 的新实例中。这是我的第一个代码片段和我的第一个问题:

我是否必须调用 Py_IncRef(self->wordlist); 在 self->wordlist = PyList_New(numLines); 或者它是多余的,因为引用已经在 PyList_new 中增加了?然后我对 PyList_SetItem(self->wordlist, i, strObj); 有同样的疑问 和 Py_IncRef(strObj);..

-当我销毁 levtree 的实例时,我想调用释放树占用的空间的 C 函数,销毁 wordlist 并减少 wordlist 中包含的所有字符串的所有引用计数。这是我的 tp_dealloc:

在这里进行所有解除分配是否正确?目前我没有 tp_clear 和 tp_free,我需要它们吗?我的代码目前适用于分配,但不适用于解除分配,因为即使我可以多次在同一个 python 变量上调用init ,在每个 python 脚本(正常工作)结束时,我都会得到一个“分段错误”,这让我认为释放过程中出现问题..

0 投票
1 回答
405 浏览

python - 如何使用 Xcode 构建 python 扩展

请求:有人可以从上到下发布一个配方,用于创建将编译 C 代码以构建 Python 扩展的 Xcode 项目吗?我在这里看到了几篇涉及该主题的帖子,但它们似乎令人困惑且不完整,并且他们不同意。

具体问题:

  1. Mac Python 2.7 可以加载 .dylib 吗?我的冷漠无视他们。

  2. 真的可以通过将 .dylib 重命名为 .so 文件扩展名来解决问题吗?各种帖子不同意这个问题。

  3. .dylib 和 .so 实际上是不同的格式吗?我可以在 Xcode 中进行设置以使其输出真正的 .so 格式吗?
  4. 如果 Python 无法加载扩展文件,是否有工具可以诊断它?有什么方法可以插入文件,查看它的格式,看看它是否与需要的匹配?

  5. 当我将 .dylib 重命名为 .so 时,我收到以下错误消息:

ImportError: dlopen(/Library/Python/2.7/site-packages/pypower.so, 2): 找不到合适的图像。确实找到了:/Library/Python/2.7/site-packages/pypower.so: mach-o,但是架构错误

我的项目针对“32 位英特尔”架构。而且我真的需要使用 32 位,因为我链接到的一些旧库。Python 在加载 32 位库时会遇到问题吗?有没有办法弥合差距?

0 投票
1 回答
492 浏览

python - 使用不同的 Visual Studio 版本编译 Python 扩展

根据Python 文档,在 Windows 上编译 Python 扩展时,“您应该使用与构建 Python 本身相同的 VC++ 版本”。通常给出的解释是VC运行时版本不匹配会导致问题。但是,可以使用似乎可以正常工作的较新 Visual Studio 版本来编译扩展。

在哪些情况下不同的运行时会导致问题?我在这个主题上看到的最多信息是python-dev 邮件列表上的这个线程。是否有一组(希望很小)导致问题行为的用例,或者我还没有遇到任何麻烦只是运气问题?

0 投票
1 回答
559 浏览

python - 在 Windows 8 上为 python 2.7 构建具有多个 pyx 文件的 cython

要构建我使用 distutils:

构建一个简单的pyx文件(setup.py):

构建多个文件(setup.py):

测试2.pyx:

构建上述工作正常,我看到编译和链接都已成功完成,但该方法似乎不在say_hello_to2二进制文件中。启动python,运行下面显示它只是test.pyx模块中的方法:

pyx是否可以在扩展构建中添加多个-file?

0 投票
1 回答
2440 浏览

python - 在 c 扩展段错误中创建 numpy 数组

我只是想在开始编写扩展之前创建一个 numpy 数组。这是一个超级简单的程序:

该程序在PyArray_SimpleNew通话中出现段错误,我不明白为什么。我正在尝试关注以前的一些问题(例如numpy array C apiC array to PyArray)。我究竟做错了什么?

0 投票
1 回答
879 浏览

python - 从 C 扩展 API 的 python 回调访问全局变量

我是 python 和 C 扩展的新手。我正在编写一个 python 代码,其中创建了两个线程并定义了一个回调函数 py_cb()。在一个线程中,我在特定时间间隔后附加到全局列表,而在另一个线程中,我正在调用 C 扩展库 api。C 扩展 api 生成一个线程,该线程调用在我的原始文件中定义的 python 回调函数 (py_cb)。在回调函数中,我试图显示全局列表,但它似乎有不同的 id。我使用 id(listName) 检查了它。有没有办法可以在 C 扩展 python 回调函数中使用正确的全局变量?我假设全局值将在所有线程之间共享,不是这样吗?另外,请提出更好的解决方案。

以下是C代码:

以下是 simple.py 文件中的 python 回调 API:

0 投票
1 回答
653 浏览

python - 构建python C++扩展——如何知道是否找不到链接库

我下载了一个 python 包装的 C++ 代码,并试图从源代码构建它,它编译时没有错误,但是当我运行最终结果时,它失败的方式似乎表明它没有找到至少一个它应该链接的库。

令我惊讶的是,在 中distutils.core.Extension,您可以提供库列表,但没有错误或消息告诉我其中一个库不存在。我可以将任何乱码字符串放入列表中,它仍然可以正常运行。里面有这个设置Extension吗?或者有什么其他的检查方法?

作为参考,这里是setup.py代码(Ubuntu 14.04,Python 2.7):

先感谢您!!

0 投票
1 回答
45 浏览

python - 用VC2010构建的boost.python

我已经使用 Visual c++ 2010(动态库,64 位)成功构建了 boost.python。我在 Windows 7 64 位上安装了 python 2.7.8 64 位。我在这里读到过,python 扩展应该使用与构建 python 本身相同的编译器来构建。我的问题是,既然 python 2.7.8 是用 Visual c++ 2008 64 位编译器构建的,我可以有以下组合吗?

  1. 我用 VC2008 64 位构建的 python 扩展(匹配 python 本身)
  2. 使用 VC2010 64 位构建的 64 位 boost.python dll
  3. python 64位,用VC2008 64位构建自己

我注意到 boost.python dll 依赖于 python dll,这就是为什么我很担心这种混合。