问题标签 [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 投票
0 回答
519 浏览

python - 通过 autodoc 为 C Python 模块提供 Sphinx 文档

我正在尝试记录主要是 C 扩展模块的 pycurl。

在这个扩展模块中有一些类,用 C 语言编写。它们有方法。这些方法上定义了文档字符串:

但是,这些方法并没有在类本身上定义:

结果,当我尝试使用 automethod 记录它们时,sphinx 说这些方法不存在:

如何让 sphinx 从 C 扩展模块中定义的方法中获取文档字符串?

0 投票
1 回答
636 浏览

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 的一个实例,我应该怎么做?

谢谢, 瓦特尔

0 投票
0 回答
467 浏览

python - 如何使用 Swig 类型映射作为指向结构的指针

我有一个 C 函数:

重点是一个简单的结构:

Polygon 也是一个 Points 列表。我在 Point 的接口中定义了一个类型映射:

我怎样才能为多边形做到这一点?

0 投票
1 回答
377 浏览

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 控制台导入扩展时收到错误消息。
0 投票
1 回答
553 浏览

python - python扩展模块中的C++静态成员初始化

简洁版本

我不明白如何可靠地初始化 python 扩展的静态成员。特别是,如何确保来自不同编译单元的代码具有特定的加载顺序,从而满足某些依赖关系?

长版

我有一些代码可以多次计算各种组合函数,例如阶乘、二项式等。只需为这些东西构建一个表,然后对它们进行查找,效率会更高。而且我需要一个很好的接口来获取值,所以我只制作 c++ 类,表作为静态成员。

作为最简单的示例,要计算阶乘,我有以下内容。在Combinatorics.hpp

Combinatorics.cpp

whereFactorialTableCalculator是一个本地函数,它只返回适当的向量。[operator()对于二项式等,这些变得更加复杂,这就是我使用类来包装这些东西的原因。]

我使用 SWIG 来包装c++代码,并从 python 中使用它。这一切都很顺利,直到我在我正在使用的新集群​​上编译了我的代码。现在我想我以前只是运气好。

一旦我在新集群上导入了我的 python 模块,python 就会出现段错误。Python 甚至没有从导入步骤中恢复过来。使用gdb,我将其追踪到代码的另一部分,其初始化调用了一个Factorial仿函数。但是FactorialTable还没有初始化,所以整个事情都呱呱叫了。

所以我需要确保在计算其他代码之前计算我的阶乘。我以所需的顺序告诉 distutils,但显然这不是他们在此集群上调用的顺序。链接过程中是否有一些我需要小心的阶段?

如果你真的有动力,你可以在这里这里浏览代码,以及在这里给出段错误的那一行。

0 投票
2 回答
3031 浏览

numpy - 将numpy整数数组传递给c代码

我正在尝试编写 Cython 代码以比 sklearn 的内置代码更快地将密集特征矩阵、目标向量对转储为 libsvm 格式。我收到一个编译错误,抱怨将目标向量(一个 numpy 整数数组)传递给相关的 c 函数时出现类型问题。

这是代码:

当我尝试使用 distutils 编译此代码时,出现错误

知道如何解决此错误吗?我最初遵循传递 y_c.data 的范式,这很有效,但这显然不是推荐的方式。

0 投票
6 回答
64167 浏览

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\binvcvars32.batvcvars64.batvcvars86_amd64.batvcvarsx86_ia64.batvcvars64.bat

随后,我按照这个页面创建了一个“hello world”测试文件。

然后,我得到了这个错误。

所以我心想:好吧,Cython 找不到那个文件,因为它不存在。(我搜索了整个硬盘驱动器。)所以我vcvars64.bat...\VC\binto复制\VC并将名称更改为vcvarsall.bat. 现在 vcvarsall 错误消失了。而且......自然会出现一个新的错误。

现在我不知道如何进行。我应该怎么办?非常感谢您的帮助。

(为了清楚起见,我确实尝试将编译器设置为 Mingw32。但还有其他错误。我现在专注于让 VC 工作。)


编辑:我尝试按照此页面上的说明使用 SDK 构建环境 CMD 。我收到了同样的错误。

0 投票
1 回答
556 浏览

python - 如何使用 PyObjects 声明 Boost.Python C++ 类

我想用 PyObjects 编写一个 c++ 类,以便从 Python 访问它们,以便用现有的 Python 对象实例引用它们。简而言之,我想在 C++ 类中存储/管理 Python 对象实例。

例如:

在 python 中,如果可以使用 Boost.Python,我想这样做:

非常感谢您!

打招呼

弗洛

0 投票
0 回答
848 浏览

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)。

0 投票
0 回答
123 浏览

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,LIBLIBPATH,但我仍然得到LINK2019错误。

所以,我有几个问题:

  1. 我可以将注册表项更改为HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows“好”路径吗?如果是这样,这会产生什么影响?
  2. 为什么这是一个问题?也许我以不同的顺序安装了 VS2008/VS2013,这可能是问题吗?