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

python - 如何使用 C api 通过完整路径导入文件?

如何指定完整的文件路径和模块名称?

喜欢PyImport_SomeFunction(const char *path_to_script, const char *name)

0 投票
2 回答
9941 浏览

python - 如何使用 Python C API 创建生成器/迭代器?

如何使用 Python C API 复制以下 Python 代码?

到目前为止,我有这个:

但我不确定下一步该去哪里。有人可以提供一些建议吗?

编辑

我想我遇到的主要问题是模拟yield语句。据我了解,这是一个看起来很简单,但实际上很复杂的语句——它创建了一个生成器,它有自己的__iter__()方法和next()自动调用的方法。搜索文档,它似乎与PyGenObject相关联;但是,如何创建该对象的新实例尚不清楚。PyGen_New()将 a 作为它的论点PyFrameObject,我能找到的唯一参考是PyEval_GetFrame(),这似乎不是我想要的(或者我弄错了吗?)。有没有人有这方面的经验可以分享?

进一步编辑

当我(基本上)扩展 Python 在幕后所做的事情时,我发现这一点更加清晰:

从技术上讲,该序列偏离了一个,但您明白了。

唯一的问题是,每次需要生成器时都创建一个新对象非常烦人——在 Python 中比在 C 中更是如此,因为定义一个新类型会带来所需的怪物。C中不能有yield语句,因为 C 没有闭包。我所做的(因为我在 Python API 中找不到它——<em>如果它已经存在,请指点我一个标准对象!)是创建一个简单的通用生成器对象类,它为每个对象调用一个 C 函数next()方法调用。在这里(请注意,我还没有尝试编译它,因为它不完整 - 见下文):

然而,不幸的是,我还没有完成。我剩下的唯一问题是:如何StopIteration使用 C API 引发异常?我似乎无法在Standard Exceptions中找到它。另外,也许更重要的是,这是解决这个问题的正确方法吗?

感谢仍在关注此内容的任何人。

0 投票
1 回答
1997 浏览

python - 使用 Python C API 命名参数?

如何使用 Python C API 模拟以下 Python 函数?

(即,这样就可以通过以下方式调用它:

)

0 投票
3 回答
1333 浏览

python - C中的Python实例方法

考虑以下 Python (3.x) 代码:

如何在 C 中编写相同的功能?

我的意思是,如何使用 C 中的方法创建对象?然后从中创建一个实例?

编辑:哦,对不起!我的意思是通过 Python C API 实现相同的功能。如何通过其 C API 创建 Python 方法?就像是:

0 投票
2 回答
3946 浏览

python - 如何在 Python 中重定向标准错误?通过 Python C API?

这是我最近的两个问题的组合:
[1] C 中的 Python 实例方法
[2]如何在 Python 中重定向 stderr?

我想从 python 脚本记录 stdout 和 stderr 的输出。

我想问的是,根据 [1] 创建一个新类型似乎相当复杂。如果不需要将新类型暴露给 Python,它是否简化了事情,即它只存在于 C 中?

我的意思是,当 Python 打印某些内容时,它会转到“Objects/fileobject.c”,然后在“PyFile_WriteObject”中检查是否可以写入其参数:

此外,可以像这样获得 stdout 和 stderr :

那么我的问题是,是否有可能构建满足上述'PyObject_GetAttrString(f,“write”)'并且可以调用的必要PyObject,以便我可以编写:

http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject

这样,就不需要将新的“编写器类型”暴露给 Python 脚本的其余部分,所以我认为编写代码可能会更简单一些......?

0 投票
5 回答
695 浏览

python - 扩展 Python:预加载我的 C 模块

我正在尝试通过我编写的一些 C 函数来扩展 Python 解释器。从阅读文档到公开这些功能,用户必须导入包含这些功能的模块。

是否可以通过 C API 加载预加载或预导入模块,以便用户不必键入import <mymodule>?甚至更好,from <mymodule> import <function>

编辑:我可以在 Py_Initialize(); 之后执行 PyRun_SimpleString("from mymodule import myfunction"); - 我只是想知道是否有另一种方法可以做到这一点..?

编辑 2:换句话说,我有一个用 C 编写的应用程序,它嵌入了一个 Python 解释器。该应用程序提供了一些我想向用户公开的功能,以便他们可以为该应用程序编写简单的 Python 脚本。我想要的只是消除编写的需要from mymodule import myfunction1, myfunction2,因为它是非常专业的应用程序,而且脚本在没有应用程序的情况下无论如何都无法工作,因此一直要求是没有意义import ...的。

0 投票
2 回答
1435 浏览

python - Python C-API 使 len(...) 与扩展类一起工作

在 Python 中创建一个类时,我可以简单地创建一个def __len__(self):方法来完成这项len(InstanceOfMyClass)工作,但是我无法通过 C-API 找到如何使用扩展类来做到这一点。

我尝试添加一个__len__方法,但这似乎不起作用

Python测试代码:

测试类代码

0 投票
1 回答
1331 浏览

python - Python C-API 模块退出处理程序 - atexit 等价物?

我正在使用 Python 2.6.4 版

当我的扩展模块退出/卸载时,我必须从 C 库调用一个函数。对于 C 扩展模块,atexit 的等价物是什么?

0 投票
2 回答
1463 浏览

python - 从 C 访问 PyBuffer 的内容

我在 python 中创建了一个缓冲区对象,如下所示:

我现在byte_stream通过 SWIG 作为参数传递给 C 函数。我有一个用于转换数据的类型图,如下所示:

我尝试了一些不同的东西,错误无法获取我的 byte_stream 的实际内容/值。如何转换或访问我byte_stream使用 C API 的内容?有许多不同的方法可以将 C 数据转换为缓冲区,但我找不到相反的方法。我曾尝试在 gcb 中查看此对象,但无论是它还是它指向包含我的数据的值都没有。

(我使用缓冲区是因为我想避免在从文件中读取数据时将数据转换为字符串的开销)我在 Linux 上使用 python 2.6。

-- 谢谢帕维尔

0 投票
1 回答
882 浏览

python - 在 Python C API 中使用多个模块/类型?

我有两个不同的 Python 扩展模块;我们称它们为 A 和 B。模块 A 包含一个称为容器的存储类类型,我想在模块 B 中将其用作类方法的返回类型。

我似乎找不到任何关于我应该如何执行此操作的文档。我大致按照这篇文章来创建模块/类,除了我没有将所有方法声明为静态的,所以它们可以访问: http: //nedbatchelder.com/text/whirlext.html

那么我的问题是,如何创建一个容器实例,我可以将其作为模块 B 中类方法的 PyObject* 返回值传回?容器定义如下所示:

我尝试在相关方法中简单地执行以下操作,其中 container_init 是我为容器类注册为 tp_init 的方法:

然而,根据 Python 解释器,我正在取回调用该方法的类。(即,myclassinstance.mymethod() 正在返回 myclassinstance)。

我显然是以错误的方式解决这个问题,但我不知道正确的方法是什么。有什么建议么?只是为了切断任何人的建议——不,我对使用 SWIG 或 Boost::Python 不感兴趣。我已经尝试过了,容器的底层存储类也不能很好地使用(SWIG 甚至无法解析它)。到目前为止,自己进行扩展非常轻松,但我对这个感到难过。