问题标签 [python-c-extension]

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

python - 具有可变数量参数的 Python 扩展模块

我试图弄清楚如何在 C 扩展模块中为函数提供一个变量(可能还有)相当多的参数。

阅读有关PyArg_ParseTuple 的信息,您似乎必须知道要接受多少,有些是强制性的,有些是可选的,但都有自己的变量。我希望PyArg_UnpackTuple能够处理这个问题,但是当我尝试以错误的方式使用它时,它似乎只会给我总线错误。

举个例子,下面的 Python 代码可能想要做成一个扩展模块(在 C 中)。

这可以用任意数量的参数调用或迭代,hypot(3,4,5), hypot([3,4,5]),并且hypot(*[3,4,5])都给出相同的答案。

我的 C 函数的开始看起来像这样


许多人认为yasar11732。下一个家伙是一个完全工作的扩展模块(_toolboxmodule.c),它简单地接受任何数字或整数参数并返回由这些参数组成的列表(名称很差)。一个玩具,但说明了需要做什么。

在python中它是:

0 投票
2 回答
2347 浏览

python - 在初始化时嵌入python错误

当我运行 C 代码调用 python 函数时, Py_Initialize() 出现错误 错误是 ImportError: No module named site. 我试图把 Py_SetProgramName(argv[0]) 但它不起作用。cmd调用是cInterfacePython Test.py multiply 3 2 (exe是cInterfacePython)

0 投票
1 回答
4518 浏览

python - 将 PyInt 转换为 C Int

我需要将 PyInt 转换为 C int。在我的代码中

pValue 是一个 PyObject,PyList。我遇到的问题是 PyList_Size 没有返回正确的列表大小(计数应该是 5,但它给了我 600 万),或者数据类型存在问题,因为我在 C 代码中与 python 脚本接口。理想情况下,我希望 count 是 C int 类型。

我找到了返回长 C 数据类型的 python/c API……这不是我想要的……任何人都可以指出正确的方法或 API?

0 投票
4 回答
29607 浏览

python - Python C 扩展:使用扩展 PYD 还是 DLL?

我有一个用 C 编写的 Python 扩展,我想知道是否应该在 Windows 下使用文件扩展名 DLL 或 PYD。(我会在 Linux 中使用什么?)

有什么区别(除了文件名)?

我找到了一篇非官方的文章。这就是pyc的秘密吗?为什么我找不到有关此主题的任何官方文章?

0 投票
4 回答
1904 浏览

python - 将 C 结构传递给 Python 函数

我需要一种简单的方法将 C 结构传递给 Python 函数。我已经将 Python 嵌入到游戏服务器中,我打算用 Python 编写游戏逻辑。我搜索了谷歌和邮件列表,没有发现任何有用的东西。我在 C 中有一个复杂的结构(带有指向其他相对复杂结构的指针)并且没有找到合理的方法来做到这一点。

我有这个结构:

并且需要将它传递给一个 Python 函数,在该函数中我可以使用通用语法轻松访问成员(最好不要使用诸如 dicts 之类的东西,尽管这也可以)。这几乎就像我需要一个 PyObject_FromStruct 函数或其他东西。

有没有相对简单的方法来做到这一点?

0 投票
2 回答
1977 浏览

python - 使用 pip 时如何设置 distutils 使用的日志级别?

我试图找出error: Unable to find vcvarsall.batafter的原因是什么pip install greenlet。我想设置 distutils 使用的日志级别,以便log.debug("Unable to find productdir in registry")打印调试消息。看了之后,def parse_command_line(self):我认为pip install --install-option="-vv" greenlet应该可以工作,但它没有(详细程度仍然为 1)。

我怎样才能做到这一点?

0 投票
3 回答
2142 浏览

python - 如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?

我注意到几个成熟的 Python 库已经为大多数架构(Win32/Win-amd64/MacOS)和 Python 版本预编译了版本。为不同环境交叉编译扩展的标准方法是什么?葡萄酒?虚拟机?众包?

0 投票
3 回答
11931 浏览

python - 将布尔值传递给 Python C 扩展的“正确”方法是什么?

这是 python 文档 (http://docs.python.org/extending/extending.html) 中的一个简单示例:

如果我想向函数传递一个额外的布尔参数 - 什么是“正确”的方法?

似乎没有布尔选项可以传递给 PyArg_ParseTuple()。所以我想到了以下几点:

  1. 读取一个整数并只使用该值(因为 bool 是 int 的子类)
  2. 对整数调用 PyBool_FromLong()
  3. 读取和对象并调用 PyBool_Check() 来验证它是一个布尔值
  4. 也许有一种方法可以获取任何类型的变量并获取其真值(即空数组将是错误的等),这就是 python 函数通常所做的。

这些中的任何一个更可取吗?其他选择?

0 投票
1 回答
287 浏览

python - 如何组织和分发带有 C 扩展的 Python 应用程序?

我正在开发一个 Python 应用程序,它作为源代码(压缩)和通过 py2exe(多数)分发。

现在我想通过用 C 扩展替换它们来加速一些模块。这对于开发部分非常有效。但是分布和组织让我很头疼……

我当前的结构如下所示:

我的问题是,我应该在哪里放置 C 扩展的设置调用/文件?我想确保我总是可以通过运行我的应用程序main.py(所以我宁愿不等到分发编译 C 扩展),但我也想确保分发始终具有最新的 C 扩展。

提前感谢您的帮助!

0 投票
0 回答
552 浏览

python - 为什么 Pythons PyObject_CallMethod 将列表参数的引用计数增加 4?

我在 Python 方面相对缺乏经验。我必须修复旧软件中的错误并卡住了。我们使用的是 Python 2.6.6。

问题如下:

C++中有一个调用如下:

Python 代码中的(简化的)updateCallback 如下所示:

list 是一个 PyObject* 并且在 CallMethod 之前它的引用计数是 1。在使用 PyObject_CallMethod 调用 updateCallback 之后,Python 代码中的 print 语句打印 5。当 PyObject_CallMethod 返回时,我在调试器中看到“列表”(AFAIK 其中对应于 updateCalback 中的 args)仍有 refcount 5。

现在,我知道使用 (O) 会将引用计数增加 1,但为什么在我的情况下它是 4?

提前致谢