问题标签 [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 回答
1430 浏览

python - Cython 对进口有什么作用?

我想创建一个 Python 扩展,我真的很喜欢使用 Cython 的想法。主要是为了获得更多关于它的知识并利用速度增益(如果有的话)。我已经阅读了很多 Cython 文档,但我还不是计算机科学家,并且没有深入的知识来理解低级基础知识,因此我提出以下问题的原因:

我只是想知道,如果我在我正在开发的 Python 扩展中使用外部导入的(例如,ORM 或 SQL 库或任何其他 3rd 方库)会发生什么?

Cython 如何处理它?

如果这个导入的库/扩展是纯 Python 还是编译过的,有区别吗?

处理这个问题的正确方法是什么?

谢谢你。

PS。问题以粗体输入。

0 投票
0 回答
4887 浏览

python - Python导入错误未定义符号:执行我的脚本时的Py_InitModule4

我正在研究python的C扩展,这个扩展C模块将进行远程过程调用(RPC)来访问网络服务。这个 C 模块将对 RPC 的结果(收集的信息)应用 Py_BuildValue 方法,并使用 PyList_Append 方法将其附加到列表中。最后,此列表对象返回到调用 Python 脚本。我们正在将此 C 模块转换为共享 .so 文件的形式以与 Python 一起使用。

为了解决一些内存泄漏问题,我修改了代码,而不是将 RPC 结果上的 Py_BuildValue 直接附加到列表中,而是将此 Py_BuildValue 结果分配给 PyObject 变量并将该变量附加到列表中。将变量附加到列表后,使用 Py_DECREF 减少此 PyObject 变量的引用计数。在此更改之后,当我在一台机器上执行 Python 脚本时,出现以下错误。

ImportError:/usr/local/support/iadrpcmodule.so:未定义符号:Py_InitModule4

但是我没有在我只使用 Py_InitModule3 的 C 模块中使用变量“Py_InitModule4”。

我使用 python 2.4 编译代码并在 64 位 linux 机器上执行它。

再次有趣的部分是当我重新启动机器时问题消失了..!!。
当我在另一台机器上尝试时,我没有遇到这个问题。

我看到根据 PEP0353 (http://www.python.org/dev/peps/pep-0353/),在 Python 2.5 的情况下,64 位机器的名称发生了变化,并防止加载假定为 32 的扩展模块位大小类型转换为具有 64 位大小类型的解释器,Py_InitModule4 被重命名为 Py_InitModule4_64。

出现此类问题的原因可能是什么以及如何在重新启动机器时解决?那是因为我的代码更改以解决内存泄漏问题,我是否需要进行任何代码更改来解决此“导入错误”?由于我没有在我的代码中使用 Py_InitModule4,我如何将其重命名为 Py_InitModule4_64 以使用 64 位机器?

我应用了一些修复的先前代码类似于以下内容

我将代码更改如下,以解决一些内存泄漏问题。

还有另一个初始化模块的函数如下我们使用 Py_InitModule3

此代码使用 Python 2.4 编译,可在任何 64 位机器上运行。执行机器可能同时具有 Python 2.4 和 Python 2.5。

我的问题是为了防止将扩展模块加载到 Python 2.5,即使我们没有使用它,我是否需要在这个模块中明确定义和重命名“Py_InitModule4”?如下所示

0 投票
3 回答
1437 浏览

python - 如何在纯 asm 中编写 python 扩展,它会高效吗?

我有中等的业余技能,Python我是初学者,asm对语言一无所知C

我知道 python C-extensions 必须遵循特定的接口才能正常工作。

这是否可以Assembly用正确的接口和完整的功能编写纯 python 扩展?第二个问题是,如果做得对,它是否足够有效?

在谷歌搜索时,我没有找到任何关于这个问题的代码示例或一些文章或解决方案。

不是关于asm从内部运行代码的问题,Python因此它与 SO 上的主题不重复。

0 投票
1 回答
381 浏览

python - 何时调用 C tp_as_mapping (et al.) 方法?

C PyObject 结构包含字段tp_as_number和。在什么情况下会调用这些?任何人都可以提供一些示例 Python 代码来调用这些 C 方法吗?tp_as_sequencetp_as_mapping

0 投票
1 回答
894 浏览

c++ - PyString_FromStringAndSize 导致分段错误

我对 python 有一个奇怪的段错误。这是有问题的代码:

我把 printf 放在那里,希望得到提示。但是长度和 fName 值是正确的。那里没有空值!

这是我从 gdb 获得的跟踪信息:

任何的想法 ?我试着环顾四周,但找不到关于这个主题的任何确切信息。

编辑:只是为了给这个问题增加更多的模糊性。仅当我在脚本中使用它时才会出现此错误。当我在 Python 中从命令行调用它时,一切正常!

编辑:这是我从 valgrind 得到的:

不太清楚这意味着什么!而且我仍然不明白为什么它在那里失败。我尝试了不同的方法,例如克隆字符串 fullName 以确保它是分配的新内存。甚至使用了新的 char[] 并在其中复制了全名。还是同样的问题,在同一个地方。

有人知道吗?它在 Python 中很常见吗?

0 投票
2 回答
10897 浏览

python - Python 扩展调试

我正在尝试调试我用 C 编写的 python 扩展模块。我使用以下代码对其进行了编译:

然后我调试:

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

我要调试的功能是:

0 投票
2 回答
150 浏览

python - 将 Python 方法转换为 C 扩展的好处?

一个相对简单的问题:
如果我将一个受 CPU 限制的瓶颈方法从 Python 转换为 C 扩展(大致实现相同的算法),

  • 我应该期望速度和性能提高多少?
  • 是什么因素决定的?

更新:人们似乎在抱怨缺乏细节。我主要是想了解哪些因素会使一段 Python 代码成为用 C 重写的良好候选者(即,如果原始 Python 受 CPU 限制,那么何时移植到 C 实际上会提高速度)。

具体来说,这是我正在查看的一段代码。基本上它是一种递归方法,它采用两个列表列表(“列”列表,其中每列包含可能进入该列的可能值......基本上是一个模式),并查看是否有可能使小于 n (通常是 1)更改(其中更改可能是向列添加新值、添加新列、删除列等),以便您有一些值序列(每列中的一个值)可以从任一模式构建。它在精神上与计算字符串之间的编辑距离非常相似。这是代码:

0 投票
1 回答
1326 浏览

c++ - 使用 boost.python 在 cygwin 中手动构建 python 扩展

对不起,这样一个笼统的标题,但我不太确定我到底错过了什么或我做错了什么。我的目标是在 cygwin 下使用 boost.python 构建一个 python 扩展,并避免使用 boost.build 工具,即使用 make 而不是 bjam。后一种方式对我来说非常好,但现在我想这样做。我通过谷歌搜索和寻找类似的主题解决了许多问题,这帮助我找出了一些技巧并继续前进。然而在最后一步似乎有一些问题。我将尝试详细描述我的所有步骤,希望这篇文章将来对其他人有用,并更好地描述设置。

因为我不太确定 python 和 boost 的原始安装(来自各种 cygwin 存储库),所以我决定在我的主目录中从头开始安装它们,所以这就是我所做的:

  1. 首先安装python。我将跳过这个细节,它或多或少是直截了当的。对于后面的描述重要的是路径:

    /home/Alexey_2/Soft/python2.6 - 这是 PYTHONPATH,也包含在 PATH 中

  2. 致力于提升:

    a) 将 boost 源解压到

    b) 制作 bjam。首先进入目录:

    接下来,调用 bootstrap.sh 这最终会在此目录中创建 b2 和 bjam 可执行文件。在 .bash_profile 中将此目录添加到 PATH,这样我们就可以调用 bjam。在这里和以后每次编辑 .bash_profile 之后,我都会重新启动 cygwin 以使更改生效

    c) 仍在

    目录 - 编辑 user-config.jam,让 bjam 知道要使用哪个 python。所以就我而言,我只添加一行:

    在 lib-path (最后一个条目)中,我放 /home/Alexey_2/Soft/python2.6/bin 因为它包含 libpython2.6.dll

    d) 好的。现在我们可以制作 boost-python 库了。进入 BOOST_ROOT 目录并执行命令

    这将创建必要的库(cygboost_python.dll 和 libboost_python.dll.a)并将它们放入

    /li>
  3. 构建python扩展。

    这是我的简单测试程序(实际上是示例代码的一部分)

    这是Makefile:

    /li>

一些评论:

  1. 库路径已设置,我针对适当的库进行编译(查看更多:用 win7-64bit 中的 mingw 用 boost.python 编译一些代码)。

  2. 上面的链接解释了为什么配置 user-config.jam 很重要——我在步骤 1c 中做了。

  3. 为了避免可能出现的问题(如上面的链接以及无法将 boost.python 与 mingw 链接(尽管对于 mingw)),我使用静态喜欢的 boost.python 库

    作为 bjam 的论据(见 1d)

  4. 正如这里所解释的:MinGW + Boost: undefined reference to `WSAStartup@8' 想要编译某些东西的库应该列在目标文件之后,这就是为什么我们有:

    并不是

    /li>

这是我的 .bash_profile 的一部分(最终),我在其中定义了环境变量:

最后,到问题。通过上述设置,我能够成功构建 python 扩展对象文件:

但是,当我通过简单的脚本对其进行测试时:

ImportError 来了:

已经注意到,出现此类问题的原因可能是使用了错误的 python 可执行文件,但事实并非如此:

预期的内容(注意 python 是从该目录到 python2.6 的符号链接)

这是我拥有的另一条有用的信息:

我想知道什么

可能意味着。可能这就是我所缺少的。但那是什么?非常感谢任何意见和建议(不仅是关于最后一个问题)。

编辑:

根据 (twsansbury) 的建议,使用 -vv 选项检查 python 模块搜索路径:

第一个目录是我调用 python 来运行脚本的地方。主要结论是 cygwin python 正在寻找具有标准 Windows 扩展的模块(库) - dll(以及其他 3 种类型),而不是我最初从 cygwin 的 Linux 仿真风格所期望的 .so。因此,将上一个 Makefile 中的以下几行更改为:

生成xyz.dll,可以成功加载:

现在给出:

0 投票
2 回答
664 浏览

c++ - 尝试/捕获以避免 .stackdump

在下面的代码中,我try/catch在 python 模块代码中使用。在该try块中,我有一个简单的错误(内存访问冲突)并试图捕获相应的异常并在不生成.stackdump文件的情况下安静地终止程序。然而,后者仍然生成,这意味着try/catch构造没有完成它的工作。.stackdump当遇到不正确的操作(如代码中的操作)时,如何避免生成文件并退出程序而不会出错?PS我正在用gcc和boost.python在cygwin中编译代码

有趣的是,它不仅适用于 case x[3]=2,而且适用于所有其他情况:例如x[4]=2or x[20]=2or ,显然,x[2]=2

编辑:

根据 Maciek 的建议,我尝试了以下技巧:

使信号处理函数抛出异常,但不退出

现在尝试在 try/catch 块中包含一个可能有问题的函数(信号函数放在类构造函数中):

然而,这样的技巧并没有像我预期的那样起作用,它会产生以下输出:

所以抛出异常,但一切都在它被捕获之前完成。有没有办法在终止进程之前让它被捕获?

0 投票
2 回答
719 浏览

python - 使用 distutils 为 python 扩展构建 RPM 时的相对包含路径

使用 python 2.6,我正在尝试为 python C 扩展模块构建一个 RPM。

setup.py我正在使用的包含以下内容:

例如,如果我运行它python setup.py build,它编译和构建没有任何错误,并使用正确的路径调用,即:/devel/foogcc

当我python setup.py bdist_rpm改为使用时,上面使用的相对路径将转换为相对于 RPM 构建目录的绝对路径,这导致gcc尝试使用以下命令进行编译:

然后编译失败,因为.h在包含路径中找不到所需的文件。

对此有任何建议或解决方法吗?