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

python - Python C API:使用通过引用传递的参数调用 Python 函数

我正在用 C 编写一个 python 模块,我需要让它调用一个 Python 函数,其中一个参数由“引用”传递。最终结果应该是 Python 函数对参数所做的事情被保存到原始 C 变量中。

为了测试,我让 tcpResumeFunc 表示的 Python 函数将传入的整数修改为 = 5。但是,当我在这段代码的末尾打印出 *resume 时,它​​保留了它的初始值 -1。我知道我误解了 API 的工作原理。有什么建议么?

0 投票
1 回答
2615 浏览

c++ - 如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?

我正在使用 python C++ API 从 C++ 程序运行 python 命令。我想将所有 python 输出捕获到一个字符串,我通过以下重定向进行管理,以捕获 pythons stdout 和 stderr 输出:

但我不知道该怎么做才能捕获 python 解释器输出....

0 投票
1 回答
1527 浏览

python - 从多个线程调用 NumPy 的 C API 函数有什么影响?

这是一项有风险的业务,我理解 Global Interpreter Lock 是并行性的强大敌人。但是,如果我使用NumPy 的 C API(特别PyArray_DATA是 NumPy 数组上的宏),从多个并发线程调用它是否有潜在的后果?

请注意,我仍将拥有 GIL,而不是通过NumPy 的线程支持发布它。此外,即使 NumPy 不保证线程安全但PyArray_DATA在实践中是线程安全的,这对我来说已经足够了

我在 Linux 上运行 Python 2.6.6 和 NumPy 1.3.0。

0 投票
2 回答
678 浏览

python - Python 2.6 使用系统编码在 C-API 中写入字符串

我有一个 Python 2.6 项目,我想使用系统编码将 utf-8 消息写入标准输出。然而,似乎直到 Python 3.2 才存在这样的函数:

PySys_FormatStdout

http://docs.python.org/dev/c-api/sys.html

有没有办法从 Python 2.6 做到这一点?

为了澄清,我有一个横幅需要在 Py_Initialize() 之后和主解释器运行之前打印。该字符串是一个包含以下内容的 c 字面量:“\n and Copyright \xC2\xA9”

其中 \xC2\xA9 是 utf-8 版权符号。我在 gdb 中验证了版权符号的编码是否正确。

更新: 我刚刚决定所有这些悲伤都是不必要的,我将从启动横幅中删除冒犯性的角色。这个问题太多了,而且缺乏文档。我的期望是这会像 Tcl 一样,其中:

  1. 嵌入式解释器的 C-API 将使在系统编码中以 unicode 编写标准输出变得容易,而不是一些默认的 ascii 编码
  2. 如果当前编码中不存在违规字符,则不会引发异常。相反,将显示一些默认替换字符。
  3. 额外的模块(例如 sys)不需要仅仅为了找出系统编码是什么而导入。
0 投票
3 回答
1575 浏览

python - 如何从 Python C 代码中断言?

我正在用 C 编写一个 Python 类,我想在我的调试代码中添加断言。assert.h很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。

我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以将它与其他 C 代码一起使用。因此,我的 Python 方法是纯 C 代码的精简包装器。

所以我不能在我的“库”代码中这样做:

因为这用 Python 污染了我的纯 C 代码。它也比简单的丑得多

我相信 Distutils 编译器总是设置,这意味着即使在调试版本中NDEBUG我也无法使用。assert.h

Mac 操作系统和 Linux。

帮助!

*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。

0 投票
1 回答
1088 浏览

python - 从 C 返回 CTypes 指针

我正在编写一个 Python C 扩展,它需要将 CTypes 指针返回到char内存中的数组(我需要与另一个需要 CTypes 指针的 Python 库交互)。

我找不到关于 C 的任何类型的 CTypes 接口的任何文档。是否有任何解决方法,例如调用 Python 指针构造函数?

提前致谢。

0 投票
1 回答
1285 浏览

python-3.x - Python 3 C-API IO 和文件执行

我在让基于 Python 2 的 C++ 引擎在 Python3 中工作时遇到了一些严重的问题。我知道整个 IO 堆栈已经改变,但我似乎尝试的一切都以失败告终。下面是前代码(Python2)和后代码(Python3)。我希望有人可以帮助我找出我做错了什么。我也boost::python用来控制引用。

该程序应该通过映射将 Python 对象加载到内存中,然后在使用 run 函数时,它会找到加载到内存中的文件并运行它。我的代码基于来自 delta3d python 管理器的示例,它们加载到文件中并立即运行它。我在 Python3 中没有看到任何等效的东西。


Python2 代码从这里开始:

接下来我从 std::map 加载文件并尝试执行它:


Python3 代码从这里开始:这是我迄今为止基于这里的一些建议所得到的......所以问题 加载:

跑:

最后,此时程序的一般状态是文件以 asTextIOWrapper和 Run: 部分加载,返回的 fd 始终为 3 并且由于某种原因_fdopen永远无法打开,FILE这意味着我无法执行类似PyRun_SimpleFile. 错误本身是ASSERTION_fdopen. 有没有更好的方法来做这一切我真的很感激任何帮助。

如果您想查看 Python2 版本的完整程序,请访问Github

0 投票
4 回答
4215 浏览

python - 在 Python 中,为什么用 C 语言实现的模块比纯 Python 模块更快,我该如何编写?

python文档指出,cPickle比Pickle快的原因是前者是用C实现的。这到底是什么意思?

我正在用 Python 制作一个高级数学模块,一些计算需要大量时间。这是否意味着如果我的程序是用 C 语言实现的,它可以做得更快吗?

我希望从其他 Python 程序中导入这个模块,就像我可以导入 cPickle 一样。

你能解释一下如何在 C 中实现一个 Python 模块吗?

0 投票
1 回答
17740 浏览

python - Py_INCREF/DECREF:何时

陈述以下内容是否正确:

  1. 如果在 C 函数中创建了 Python 对象,但该函数没有返回它,则 noINCREF是必需的,但 aDECREF是。

  2. [false]如果函数确实返回了,你确实需要INCREF在接收返回值的函数中,[/false]

  3. 将 C 类型变量作为属性(如doubleint)分配给 Python 对象时,不需要INCREFor DECREF

  4. 以下内容可以安全使用吗?将 Python 对象作为属性分配给其他 Python 对象,如下所示:

    /li>
  5. Python 对象的释放需要DECREF对其作为属性的所有其他 Python 对象进行,但对于 C 类型的属性则不需要。


编辑:

关于“C 类型作为属性”,我的意思是 bar 和 baz:

0 投票
6 回答
34757 浏览

python - Python(和 Python C API):__new__ 与 __init__

我要问的问题似乎与Python 对 __new__ 和 __init__ 的使用重复?,但无论如何,我仍然不清楚和之间的实际区别__new__是什么__init__

在你急于告诉我这__new__是用于创建对象和__init__初始化对象之前,让我明确一点:我明白了。 事实上,这种区别对我来说是很自然的,因为我在 C++ 中有过放置 new的经验,它同样将对象分配与初始化分开。

Python C API 教程是这样解释的:

新成员负责创建(而不是初始化)该类型的对象。它在 Python 中作为__new__()方法公开。... 实现新方法的一个原因是确保实例变量的初始值

所以,是的 - 我明白__new__,但尽管如此,我仍然不明白为什么它在 Python 中很有用。给出的示例表明,__new__如果您想“确保实例变量的初始值”,这可能很有用。好吧,这不正是__init__会做的吗?

在 C API 教程中,显示​​了一个示例,其中创建了一个新类型(称为“Noddy”),并定义了该类型的__new__函数。Noddy 类型包含一个名为 的字符串成员first,该字符串成员被初始化为一个空字符串,如下所示:

请注意,如果没有__new__此处定义的方法,我们将不得不使用PyType_GenericNew,它只是将所有实例变量成员初始化为 NULL。所以该__new__方法的唯一好处是实例变量将以空字符串开始,而不是 NULL。 但是为什么这很有用,因为如果我们关心确保我们的实例变量被初始化为某个默认值,我们可以在__init__方法中做到这一点?