问题标签 [python-c-api]

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 回答
1881 浏览

python - 从 C API 在 Python 模块中定义全局变量

我正在使用 C API 为 Python 开发一个模块。如何创建一个被 Python 视为全局的变量?

例如,如果我的模块是module,我想创建一个变量g来完成这项工作:

尤其g是整数。

Alex Martelli 的解决方案

0 投票
1 回答
5334 浏览

python - Python C API:打开 PyObject 类型

我有一些代码可以将 Python 与 C++ 接口,这些代码运行良好,但每次我看到它时,我都认为必须有更好的方法来做到这一点。在 C++ 方面,有一个“变体”类型可以处理固定范围的基本类型——int、real、string、变体向量等。我有一些代码使用 Python API 从等效的 Python 类型转换。它看起来像这样:

问题是链式 if-else ifs。它似乎在调用一个 switch 语句,或者一个由类型标识符作为键的创建函数的表或映射。换句话说,我希望能够写出类似的东西:

根据对 API 文档的浏览,直接在此处获取“typeID”的最佳方法并不明显。我看到我可以做这样的事情:

这显然让我快速了解类型信息,但是使用它与我感兴趣的有限类型集相关的最简洁的方法是什么?

0 投票
10 回答
92974 浏览

c++ - 从 C/C++ 调用 python 方法,并提取其返回值

我想从 C 调用一个在 Python 模块中定义的自定义函数。我有一些初步代码可以做到这一点,但它只是将输出打印到标准输出。

我的测试.py

测试.cpp

如何将返回值提取到 Cdouble中并在 C 中使用它?

0 投票
3 回答
6926 浏览

python - 在 Python C API 中返回多个对象的元组

我正在编写一个将返回多个 Python 对象的本机函数

这编译得很好,但是,当我从 Python 程序调用它时,我得到一个错误:

SystemError:错误的格式字符传递给 Py_BuildValue

如何正确地做到这一点?

编辑:以下作品

但是,没有更短的方法可以做到这一点吗?

0 投票
0 回答
509 浏览

python - 如何使用 Visual Basic 2005 中的 python 2.6?

从 Visual Basic 2005 调用 python 脚本的最佳方式是什么?

我有一个用 Visual Basic 2005 编写的应用程序,它需要调用一个用 python 编写的库。该库需要 python 2.6。我正在使用 python C API 从 Visual Basic 代码(私有声明函数 blah lib“python26.dll”等)访问 python 库。我这样做是因为我想在 python 库完成它的事情之后从 python 中提取值。不幸的是,我收到关于 C 运行时的错误:

“R6034:应用程序试图错误地加载 C 运行时库。”

认为这是 MSVCR80.dll(2005 运行时)和 MSVCR90.dll(python 26 使用的 2008 运行时)之间的冲突。使用 Visual C++ 2005 编写的简单存根程序与 Visual Basic 代码执行基本相同的操作也会引发该错误。如果我用 Visual C++ 2008 编译它运行良好。

那么我该怎么办呢?我无法离开 VB,甚至无法迁移到 2008 版本。我已经使用 MSVC 2005 重新编译了 python 2.6,但这还不够。我是否必须跟踪库使用的所有 python 包并重新编译它们?似乎必须有一个更简单的方法。

0 投票
1 回答
9567 浏览

c++ - .so 模块未在 python 中导入:动态模块未定义 init 函数

我正在尝试为 C 函数编写一个 python 包装器。编写完所有代码并编译后,Python 无法导入模块。我正在按照此处给出的示例进行操作。在修正了一些错别字后,我在这里复制它。有一个文件 myModule.c:

由于我在使用 Macports python 的 Mac 上,我将其编译为

但是,当我尝试导入它时出现错误。

为什么我不能导入?

0 投票
1 回答
16792 浏览

python - 使用 Python 的 C API 创建一个对象

假设我将对象布局定义为:

...和我的类型定义:

如何pyfoo在我的 C 扩展中创建某个位置的新实例?

0 投票
2 回答
1259 浏览

c++ - 试图将 python 嵌入到 Visual Studio 2010 C++ 文件中,并以代码 1 退出

我正在尝试将一些 python 代码嵌入到我正在使用 ms Visual Studio C++ 2010 开发的 C++ 应用程序中。但是当我运行该程序时,当我调用 Py_initialize() 时它以代码 0x01 退出。

我不知道如何找出问题所在。帮助文件说, Py_Initialize 不能返回错误值,它只会失败。但是,为什么失败了?

我正在使用自编译的 python27_d.dll,它是使用从 python.org 下载的源代码中的 msvs 项目文件创建的。

0 投票
2 回答
604 浏览

python - 关于如何加快距离计算的建议

考虑以下类:

我用它来计算向量的两个元素之间的距离。我基本上为使用此距离度量的向量的每个维度创建该类的一个实例(有些维度使用其他距离度量)。分析显示,__call__这个类的功能占了我的 knn 实现的 90% 的运行时间(谁会想到)。我认为没有任何纯 Python 方法可以加快速度,但也许如果我用 C 实现它?

如果我运行一个简单的 C 程序,它只使用上面的公式计算随机值的距离,它比 Python 快几个数量级。所以我尝试使用ctypes并调用一个 C 函数来进行计算,但显然参数和返回值的转换非常昂贵,因为生成的代码要慢得多。

我当然可以在 C 中实现整个 knn 并调用它,但问题是,就像我所描述的,我对向量的某些维度使用不同的距离函数,并且将这些转换为 C 将是太多的工作。

那么我的替代方案是什么?使用Python C-API编写 C 函数会摆脱开销吗?还有其他方法可以加快计算速度吗?

0 投票
3 回答
18617 浏览

c++ - 如何在 C++ 代码中捕获 python 标准输出

我有一个程序,在它运行期间有时需要调用 python 来执行一些任务。我需要一个调用 python 并捕获 python 标准输出并将其放入某个文件的函数。这是函数的声明

我的问题是捕获给定命令(pythonInput)的所有python输出。我没有使用 python API 的经验,我不知道什么是正确的技术来做到这一点。我尝试的第一件事是使用 Py_run_SimpleString 重定向 python 的 sdtout 和 stderr 这是我编写的代码的一些示例。

有一个更好的方法吗?此外,由于某种原因,PyRun_SimpleString 在得到一些数学表达式时什么也不做,例如 PyRun_SimpleString("5**3") 什么也不打印(python conlsul 打印结果:125)

也许这很重要,我正在使用 Visual Studio 2008。谢谢,Alex


我根据马克的建议做出的改变:

运行 main 后得到的输出:

这对我有好处,但只有一个问题,应该是

我不知道为什么,但是在运行此命令后: PythonPrinting("1+5"), PyString_AsString(output) 命令返回一个空字符串 (char*) 而不是 6... :( 有什么我可以做的吗?输出?

谢谢,亚历克斯