问题标签 [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.
python - Python C API:使用通过引用传递的参数调用 Python 函数
我正在用 C 编写一个 python 模块,我需要让它调用一个 Python 函数,其中一个参数由“引用”传递。最终结果应该是 Python 函数对参数所做的事情被保存到原始 C 变量中。
为了测试,我让 tcpResumeFunc 表示的 Python 函数将传入的整数修改为 = 5。但是,当我在这段代码的末尾打印出 *resume 时,它保留了它的初始值 -1。我知道我误解了 API 的工作原理。有什么建议么?
c++ - 如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?
我正在使用 python C++ API 从 C++ 程序运行 python 命令。我想将所有 python 输出捕获到一个字符串,我通过以下重定向进行管理,以捕获 pythons stdout 和 stderr 输出:
但我不知道该怎么做才能捕获 python 解释器输出....
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。
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 一样,其中:
- 嵌入式解释器的 C-API 将使在系统编码中以 unicode 编写标准输出变得容易,而不是一些默认的 ascii 编码
- 如果当前编码中不存在违规字符,则不会引发异常。相反,将显示一些默认替换字符。
- 额外的模块(例如 sys)不需要仅仅为了找出系统编码是什么而导入。
python - 如何从 Python C 代码中断言?
我正在用 C 编写一个 Python 类,我想在我的调试代码中添加断言。assert.h
很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。
我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以将它与其他 C 代码一起使用。因此,我的 Python 方法是纯 C 代码的精简包装器。
所以我不能在我的“库”代码中这样做:
因为这用 Python 污染了我的纯 C 代码。它也比简单的丑得多
我相信 Distutils 编译器总是设置,这意味着即使在调试版本中NDEBUG
我也无法使用。assert.h
Mac 操作系统和 Linux。
帮助!
*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。
python - 从 C 返回 CTypes 指针
我正在编写一个 Python C 扩展,它需要将 CTypes 指针返回到char
内存中的数组(我需要与另一个需要 CTypes 指针的 Python 库交互)。
我找不到关于 C 的任何类型的 CTypes 接口的任何文档。是否有任何解决方法,例如调用 Python 指针构造函数?
提前致谢。
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
python - 在 Python 中,为什么用 C 语言实现的模块比纯 Python 模块更快,我该如何编写?
python文档指出,cPickle比Pickle快的原因是前者是用C实现的。这到底是什么意思?
我正在用 Python 制作一个高级数学模块,一些计算需要大量时间。这是否意味着如果我的程序是用 C 语言实现的,它可以做得更快吗?
我希望从其他 Python 程序中导入这个模块,就像我可以导入 cPickle 一样。
你能解释一下如何在 C 中实现一个 Python 模块吗?
python - Py_INCREF/DECREF:何时
陈述以下内容是否正确:
如果在 C 函数中创建了 Python 对象,但该函数没有返回它,则 no
INCREF
是必需的,但 aDECREF
是。[false]如果函数确实返回了,你确实需要
INCREF
在接收返回值的函数中,[/false]将 C 类型变量作为属性(如
double
等int
)分配给 Python 对象时,不需要INCREF
orDECREF
。以下内容可以安全使用吗?将 Python 对象作为属性分配给其他 Python 对象,如下所示:
/li>Python 对象的释放需要
DECREF
对其作为属性的所有其他 Python 对象进行,但对于 C 类型的属性则不需要。
编辑:
关于“C 类型作为属性”,我的意思是 bar 和 baz:
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__
方法中做到这一点?