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

python - 使用 C API 创建在 python 中声明的 python 类的实例

我想创建一个__main__使用 C API 在范围内定义的 Python 类的实例。

例如调用类MyClass,定义如下:

类类型位于__main__范围内。

在 C 应用程序中,我想创建此类的一个实例。这本来可以很简单,PyInstance_New因为它需要类名。但是,此功能在 Python3 中不可用。

任何有关替代方案的帮助或建议表示赞赏。

谢谢,保罗

0 投票
4 回答
562 浏览

c++ - 我可以在扩展 Python 时使用 C++ 功能吗?

Python 手册说您可以在 C 和 C++ 中为 Python 创建模块。在使用 C++ 时,您可以利用类和模板之类的东西吗?它不会与其他库和解释器产生不兼容吗?

0 投票
3 回答
6241 浏览

python - 停止嵌入式 Python

我将 Python 解释器嵌入到 C 程序中。但是,在运行某些 python 脚本时,可能PyRun_SimpleString()会遇到无限循环或执行时间过长的情况。考虑PyRun_SimpleString("while 1: pass");在防止主程序阻塞时,我认为我可以在线程中运行解释器。

如何停止在线程中运行的嵌入式解释器中执行 python 脚本而不杀死整个进程?

是否可以将异常传递给解释器?我应该将脚本包装在其他会监听信号的脚本下吗?

PS:我可以在一个单独的进程中运行 python 但这不是我想要的——除非它是最后的手段......


更新:

所以,它现在有效。再次感谢 Denis Otkidach!

如果我没看错,您必须做两件事:告诉解释器停止并return -1在 PyRun_SimpleString() 运行的同一线程中。

要停止,有几种可能性:PyErr_SetString(PyExc_KeyboardInterrupt, "...")或者PyErr_SetInterrupt()- 第一个可能让 Python 运行更多指令然后它停止,后一个立即停止执行。

return -1用于将Py_AddPendingCall()函数调用注入 Python 执行。文档从 2.7 和 3.1 版本开始提到它,但它也可以在早期的 Python 上运行(此处为 2.6)。从 2.7 和 3.1 开始,它也应该是线程安全的,这意味着您可以在不获取 GIL (?) 的情况下调用它。

所以可以重写下面的例子:

0 投票
1 回答
1820 浏览

python - 为什么 Python 在 False 和 True 上保留引用计数?

我正在查看 hasattr 内置函数的源代码,并注意到有几行引起了我的兴趣:

不是Py_False全球Py_True价值观吗?纯粹出于好奇,为什么 Python 保留这些变量的引用计数?

0 投票
6 回答
3500 浏览

c++ - Python 解释器作为 c++ 类

我正在将 python 嵌入到 C++ 中。在某些特殊情况下,我需要在同一个线程中使用两个单独的解释器实例。

我可以将 Python 解释器包装到 c++ 类中并从两个或多个类实例中获取服务吗?

0 投票
2 回答
1704 浏览

c++ - PyDateTime_IMPORT 宏未初始化 PyDateTimeAPI 变量

我正在使用 Visual Studio 2008 在 Windows 上使用 Python C API。当我尝试使用PyDate_Check宏和其他相关宏时,它们会导致访问冲突,因为静态变量 PyDateTimeAPI 为空。此变量使用PyDateTime_IMPORT需要在使用任何日期时间宏之前调用的宏进行初始化。我在单独的线程上创建新的 Python 子解释器时这样做。

几个问题
- 为什么宏PyCObject_Import中的函数PyDateTime_IMPORT返回 null。我理解 null 返回值是因为找不到模块。但是怎么找不到 datetime 模块呢?可能是因为子解释器中的 sys.path 不正确吗?- 另外,我是否PyDateTime_IMPORT在正确的位置调用宏,应该是在初始化子解释器之后,还是在初始化 Python 解释器时?

PyDateTime_IMPORT定义:

0 投票
1 回答
901 浏览

python - PyAPI_DATA() 宏的解释?

我在网上搜索过,似乎找不到文档,甚至找不到 PyAPI_DATA() 作用的简单解释(即使它在 Python 头文件中使用在 python.org 上引用)。任何人都可以解释这是什么或指向我忽略的文档吗?

谢谢。

0 投票
1 回答
19028 浏览

python - 如何在 Python setup.py 脚本中将标志传递给 gcc?

我正在用 C 编写一个 Python 扩展,它需要 CoreFoundation 框架(除其他外)。这可以很好地编译:

(“-framework”是一个仅限 Apple 的 gcc 扩展,但没关系,因为无论如何我都在使用他们的特定框架)

如何告诉 setup.py 将此标志传递给 gcc?

我试过这个,但它似乎不起作用(它编译,但当我尝试运行它时抱怨未定义的符号):

编辑:

这似乎有效:

0 投票
1 回答
1433 浏览

python - 嵌套的 Python C 扩展/模块?

如何编译 C-Python 模块以使其对另一个模块是本地的?例如,如果我有一个名为“bar”的模块和另一个名为“mymodule”的模块,我如何编译“bar”以便它通过“import mymodule.bar”导入?

(抱歉,如果措辞不好,我不确定它的正确术语是什么。)

我在 setup.py 中尝试了以下操作,但似乎不起作用:

编辑

谢谢亚历克斯。所以这就是我最终使用的:

当然还有一个名为“mymodule”的文件夹,其中包含__init__.py.

0 投票
1 回答
1725 浏览

python - 在 C++ 模块中创建 PyTuple 崩溃

这段代码有一些问题。试图从我正在编写的 C++ 模块中返回一个元组(坐标)。它看起来对我来说,dirty列表包含两个Coords 所以len是 2,列表中项目的x和值分别是和。我第一次尝试这个,所以我很可能误解了文档或其他东西。有什么提示吗?y0,00,1

编辑:哦,忘了提,实际的崩溃是PyTuple_Set_ITEM在线的。