问题标签 [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.
python - Cython 对进口有什么作用?
我想创建一个 Python 扩展,我真的很喜欢使用 Cython 的想法。主要是为了获得更多关于它的知识并利用速度增益(如果有的话)。我已经阅读了很多 Cython 文档,但我还不是计算机科学家,并且没有深入的知识来理解低级基础知识,因此我提出以下问题的原因:
我只是想知道,如果我在我正在开发的 Python 扩展中使用外部导入的(例如,ORM 或 SQL 库或任何其他 3rd 方库)会发生什么?
Cython 如何处理它?
如果这个导入的库/扩展是纯 Python 还是编译过的,有区别吗?
处理这个问题的正确方法是什么?
谢谢你。
PS。问题以粗体输入。
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”?如下所示
python - 如何在纯 asm 中编写 python 扩展,它会高效吗?
我有中等的业余技能,Python
我是初学者,asm
对语言一无所知C
。
我知道 python C
-extensions 必须遵循特定的接口才能正常工作。
这是否可以Assembly
用正确的接口和完整的功能编写纯 python 扩展?第二个问题是,如果做得对,它是否足够有效?
在谷歌搜索时,我没有找到任何关于这个问题的代码示例或一些文章或解决方案。
这不是关于asm
从内部运行代码的问题,Python
因此它与 SO 上的主题不重复。
python - 何时调用 C tp_as_mapping (et al.) 方法?
C PyObject 结构包含字段tp_as_number
和。在什么情况下会调用这些?任何人都可以提供一些示例 Python 代码来调用这些 C 方法吗?tp_as_sequence
tp_as_mapping
c++ - PyString_FromStringAndSize 导致分段错误
我对 python 有一个奇怪的段错误。这是有问题的代码:
我把 printf 放在那里,希望得到提示。但是长度和 fName 值是正确的。那里没有空值!
这是我从 gdb 获得的跟踪信息:
任何的想法 ?我试着环顾四周,但找不到关于这个主题的任何确切信息。
编辑:只是为了给这个问题增加更多的模糊性。仅当我在脚本中使用它时才会出现此错误。当我在 Python 中从命令行调用它时,一切正常!
编辑:这是我从 valgrind 得到的:
不太清楚这意味着什么!而且我仍然不明白为什么它在那里失败。我尝试了不同的方法,例如克隆字符串 fullName 以确保它是分配的新内存。甚至使用了新的 char[] 并在其中复制了全名。还是同样的问题,在同一个地方。
有人知道吗?它在 Python 中很常见吗?
python - Python 扩展调试
我正在尝试调试我用 C 编写的 python 扩展模块。我使用以下代码对其进行了编译:
然后我调试:
它在 py_node_make (我定义的函数之一)处中断,但随后我尝试:
我要调试的功能是:
python - 将 Python 方法转换为 C 扩展的好处?
一个相对简单的问题:
如果我将一个受 CPU 限制的瓶颈方法从 Python 转换为 C 扩展(大致实现相同的算法),
- 我应该期望速度和性能提高多少?
- 是什么因素决定的?
更新:人们似乎在抱怨缺乏细节。我主要是想了解哪些因素会使一段 Python 代码成为用 C 重写的良好候选者(即,如果原始 Python 受 CPU 限制,那么何时移植到 C 实际上会提高速度)。
具体来说,这是我正在查看的一段代码。基本上它是一种递归方法,它采用两个列表列表(“列”列表,其中每列包含可能进入该列的可能值......基本上是一个模式),并查看是否有可能使小于 n (通常是 1)更改(其中更改可能是向列添加新值、添加新列、删除列等),以便您有一些值序列(每列中的一个值)可以从任一模式构建。它在精神上与计算字符串之间的编辑距离非常相似。这是代码:
c++ - 使用 boost.python 在 cygwin 中手动构建 python 扩展
对不起,这样一个笼统的标题,但我不太确定我到底错过了什么或我做错了什么。我的目标是在 cygwin 下使用 boost.python 构建一个 python 扩展,并避免使用 boost.build 工具,即使用 make 而不是 bjam。后一种方式对我来说非常好,但现在我想这样做。我通过谷歌搜索和寻找类似的主题解决了许多问题,这帮助我找出了一些技巧并继续前进。然而在最后一步似乎有一些问题。我将尝试详细描述我的所有步骤,希望这篇文章将来对其他人有用,并更好地描述设置。
因为我不太确定 python 和 boost 的原始安装(来自各种 cygwin 存储库),所以我决定在我的主目录中从头开始安装它们,所以这就是我所做的:
首先安装python。我将跳过这个细节,它或多或少是直截了当的。对于后面的描述重要的是路径:
/home/Alexey_2/Soft/python2.6 - 这是 PYTHONPATH,也包含在 PATH 中
致力于提升:
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>构建python扩展。
这是我的简单测试程序(实际上是示例代码的一部分)
这是Makefile:
/li>
一些评论:
库路径已设置,我针对适当的库进行编译(查看更多:用 win7-64bit 中的 mingw 用 boost.python 编译一些代码)。
上面的链接解释了为什么配置 user-config.jam 很重要——我在步骤 1c 中做了。
为了避免可能出现的问题(如上面的链接以及无法将 boost.python 与 mingw 链接(尽管对于 mingw)),我使用静态喜欢的 boost.python 库
作为 bjam 的论据(见 1d)
正如这里所解释的: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,可以成功加载:
现在给出:
c++ - 尝试/捕获以避免 .stackdump
在下面的代码中,我try/catch
在 python 模块代码中使用。在该try
块中,我有一个简单的错误(内存访问冲突)并试图捕获相应的异常并在不生成.stackdump
文件的情况下安静地终止程序。然而,后者仍然生成,这意味着try/catch
构造没有完成它的工作。.stackdump
当遇到不正确的操作(如代码中的操作)时,如何避免生成文件并退出程序而不会出错?PS我正在用gcc和boost.python在cygwin中编译代码
有趣的是,它不仅适用于 case x[3]=2
,而且适用于所有其他情况:例如x[4]=2
or x[20]=2
or ,显然,x[2]=2
。
编辑:
根据 Maciek 的建议,我尝试了以下技巧:
使信号处理函数抛出异常,但不退出
现在尝试在 try/catch 块中包含一个可能有问题的函数(信号函数放在类构造函数中):
然而,这样的技巧并没有像我预期的那样起作用,它会产生以下输出:
所以抛出异常,但一切都在它被捕获之前完成。有没有办法在终止进程之前让它被捕获?
python - 使用 distutils 为 python 扩展构建 RPM 时的相对包含路径
使用 python 2.6,我正在尝试为 python C 扩展模块构建一个 RPM。
setup.py
我正在使用的包含以下内容:
例如,如果我运行它python setup.py build
,它编译和构建没有任何错误,并使用正确的路径调用,即:/devel/foo
gcc
当我python setup.py bdist_rpm
改为使用时,上面使用的相对路径将转换为相对于 RPM 构建目录的绝对路径,这导致gcc
尝试使用以下命令进行编译:
然后编译失败,因为.h
在包含路径中找不到所需的文件。
对此有任何建议或解决方法吗?