问题标签 [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 - 通过 autodoc 为 C Python 模块提供 Sphinx 文档
我正在尝试记录主要是 C 扩展模块的 pycurl。
在这个扩展模块中有一些类,用 C 语言编写。它们有方法。这些方法上定义了文档字符串:
但是,这些方法并没有在类本身上定义:
结果,当我尝试使用 automethod 记录它们时,sphinx 说这些方法不存在:
如何让 sphinx 从 C 扩展模块中定义的方法中获取文档字符串?
python - 为什么 PyObject_IsInstance 在我的示例代码中总是返回 0
我写了一个示例来学习python,但是当调用PyObject_IsInstance时,这个函数总是返回0。这是我的c代码ReadBuf.c
下面是我的python代码client.py
我将作为 pyTest 实例的 b 传递给 C,并由 PyArg_ParseTuple 解析给 pyTest。运行 PyObject_IsInstance 时,结果始终为零,这意味着 pyTest 不是 Test 的实例。我的问题:当从 python 向 C 传递参数时,类型是否改变了?如果我想比较 pyTest 是 Test 的一个实例,我应该怎么做?
谢谢, 瓦特尔
python - 如何使用 Swig 类型映射作为指向结构的指针
我有一个 C 函数:
重点是一个简单的结构:
Polygon 也是一个 Points 列表。我在 Point 的接口中定义了一个类型映射:
我怎样才能为多边形做到这一点?
c - Python 努力创建一个包装第 3 方 dll 的 C 扩展
我们正在尝试包装一个第 3 方 dll(用 C 编写)以通过 python 访问它。dll 有一个 .lib .c 和一个 .h 文件。我们通过 .c 文件访问 dll。
在扩展程序之外(作为控制台应用程序运行),代码可以正常工作。没有第 3 方 dll,python 扩展可以正常工作。当尝试将第三方 dll 与 python 扩展结合起来时,问题就出现了。
这是 distutil 安装脚本
########## Setup.py ############################### ################################################# ##ca_vc_opt_e.lib 和 ca_vc_e.dll 是包含我们要访问的第三方方法的库。
cacint.h 和 cacint.c 是充当 ca_vc_opt_e.lib 和 ca_vc_e.dll 接口的文件。
- chemAppPython.c 是包含代码的文件,其中包含对 cacint.c(实际上是第三方 dll)的调用,将 C 代码暴露给 Python。
- 我从 python 网站遵循了适用于 Windows 的 Python 扩展教程。
- 我可以从 Visual Studio 10.0 成功构建扩展,并使扩展从 Python 的源代码构建运行。
- 我无法通过已安装的 python(不是源代码构建)使其工作 我将创建的 .pyd 文件复制到 site-package 文件夹,当我尝试从 python 控制台导入扩展时收到错误消息。
python - python扩展模块中的C++静态成员初始化
简洁版本
我不明白如何可靠地初始化 python 扩展的静态成员。特别是,如何确保来自不同编译单元的代码具有特定的加载顺序,从而满足某些依赖关系?
长版
我有一些代码可以多次计算各种组合函数,例如阶乘、二项式等。只需为这些东西构建一个表,然后对它们进行查找,效率会更高。而且我需要一个很好的接口来获取值,所以我只制作 c++ 类,表作为静态成员。
作为最简单的示例,要计算阶乘,我有以下内容。在Combinatorics.hpp
:
在Combinatorics.cpp
:
whereFactorialTableCalculator
是一个本地函数,它只返回适当的向量。[operator()
对于二项式等,这些变得更加复杂,这就是我使用类来包装这些东西的原因。]
我使用 SWIG 来包装c++
代码,并从 python 中使用它。这一切都很顺利,直到我在我正在使用的新集群上编译了我的代码。现在我想我以前只是运气好。
一旦我在新集群上导入了我的 python 模块,python 就会出现段错误。Python 甚至没有从导入步骤中恢复过来。使用gdb
,我将其追踪到代码的另一部分,其初始化调用了一个Factorial
仿函数。但是FactorialTable
还没有初始化,所以整个事情都呱呱叫了。
所以我需要确保在计算其他代码之前计算我的阶乘。我以所需的顺序告诉 distutils,但显然这不是他们在此集群上调用的顺序。链接过程中是否有一些我需要小心的阶段?
如果你真的有动力,你可以在这里和这里浏览代码,以及在这里给出段错误的那一行。
numpy - 将numpy整数数组传递给c代码
我正在尝试编写 Cython 代码以比 sklearn 的内置代码更快地将密集特征矩阵、目标向量对转储为 libsvm 格式。我收到一个编译错误,抱怨将目标向量(一个 numpy 整数数组)传递给相关的 c 函数时出现类型问题。
这是代码:
当我尝试使用 distutils 编译此代码时,出现错误
知道如何解决此错误吗?我最初遵循传递 y_c.data 的范式,这很有效,但这显然不是推荐的方式。
python - 在 Windows x64 中运行 Cython - 致命错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录
我一直在尝试在我的 Window 7 系统上安装 Cython for Python 2.7。特别是,我更喜欢 64 位的所有内容。(如果您想知道,我需要 Cython,因为 Cython 是我需要的另一个软件包的组件之一,用于一些专门的数值分析。x64 可能是存储大型数据集的优势。)
于是我从官网下载了x64 Python 2.7。从Christoph Gohlke 那里得到 Cython。当然是 Python 2.7 的 amd64 版本。在安装之前,我将 Python 2.7 添加到注册表中,其中包含在Joe DF 的答案.reg
中找到的文件。之后,我从这里(我认为它不起作用)和这里(但这个应该)安装了 Visual C++ 编译器。此时,我的目录中有所有, , , . 我跑了,没有错误信息。C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
vcvars32.bat
vcvars64.bat
vcvars86_amd64.bat
vcvarsx86_ia64.bat
vcvars64.bat
随后,我按照这个页面创建了一个“hello world”测试文件。
然后,我得到了这个错误。
所以我心想:好吧,Cython 找不到那个文件,因为它不存在。(我搜索了整个硬盘驱动器。)所以我vcvars64.bat
从...\VC\bin
to复制\VC
并将名称更改为vcvarsall.bat
. 现在 vcvarsall 错误消失了。而且......自然会出现一个新的错误。
现在我不知道如何进行。我应该怎么办?非常感谢您的帮助。
(为了清楚起见,我确实尝试将编译器设置为 Mingw32。但还有其他错误。我现在专注于让 VC 工作。)
编辑:我尝试按照此页面上的说明使用 SDK 构建环境 CMD 。我收到了同样的错误。
python - 如何使用 PyObjects 声明 Boost.Python C++ 类
我想用 PyObjects 编写一个 c++ 类,以便从 Python 访问它们,以便用现有的 Python 对象实例引用它们。简而言之,我想在 C++ 类中存储/管理 Python 对象实例。
例如:
在 python 中,如果可以使用 Boost.Python,我想这样做:
非常感谢您!
打招呼
弗洛
python - Python C 扩展 OpenMP
当我尝试访问由我自己的 OpenMP C++ 扩展返回的变量时,我在 python 解释器中遇到了分段违规。
我找到的所有解决方案都使用 ctypes 或 cython(我不能使用)。http://snatverk.blogspot.de/2012/03/c-parallel-modules-for-python.html展示了一个启用 OpenMP 的 python 扩展的小例子。尽管我尝试像示例中那样实现我的 for 循环,但它仍然不起作用。
我的代码扩展代码功能如下所示:
函数 matcher_match() 接收两个列表,names 和 namesB。我检查名称和名称B(它们的浮点属性)的每个组合是否存在由函数test_pair_ij()指示的特定条件。该函数是一个纯 C(++) 实现,不会回调到 python。
C 扩展被调用:
当列表名称和名称B 相当小时,代码运行正常。但是对于更大的列表,我无法再在 python 代码中访问 matchResult。当我尝试这样做时,我得到了分段违规(我猜这是在 python 解释器内部)。我已经在没有 openmp 的情况下重新编译了 C 扩展,它再次运行正常,即使是更大的列表。
我想问题是我从我的扩展访问的 python 变量的内存中的一些混乱。这可能与 GIL 有关,尽管我正在发布和获取它。在这种情况下,我是否需要将更多变量设为私有?对此还有其他想法吗?
编辑:修复函数 test_pair_ij 的调用参数。
编辑 2:存储 matchIdcs 的固定代码
答案:
代码正在释放 GIL 并调用PyList_SetItem(matchIdcs, i, matchVal); 正在修改不允许的 python 结构(请参阅http://docs.cython.org/src/userguide/external_C_code.html#releasing-the-gil)。
python - Python windows 扩展 vcvarsall.bat 不正确的 windows SDK 注册表项
我在尝试在特定机器上构建 Python 扩展时遇到了很多麻烦。它同时安装了 VS2008 和 VS2013,以及我认为正确的 C/C++ 库等。我还在比较两台具有大致相同软件的机器,vcvarsall.bat
并且bin\amd64\vcvarsamd64.bat
文件相同。
我注意到的一个区别是两台机器的 from 值:GetWindowsSdkDirHelper
不同bin\amd64\vcvarsamd64.bat
:
- 好的:
C:\Program Files\\Microsoft SDKs\Windows\v6.0A\
- “坏的”:
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\
我已经尝试过,基于vcvarsall.bat 设置的各种环境变量:
SET LIB=C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\x64
. 这消除了一个错误,但我仍然得到error LINK2019: unresolved external symbol __imp_QueryPerformanceCounter
加上 6 个类似的错误。- 我已经尝试设置
INCLUDE
,LIB
和LIBPATH
,但我仍然得到LINK2019
错误。
所以,我有几个问题:
- 我可以将注册表项更改为
HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows
“好”路径吗?如果是这样,这会产生什么影响? - 为什么这是一个问题?也许我以不同的顺序安装了 VS2008/VS2013,这可能是问题吗?