问题标签 [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.
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中它是:
python - 在初始化时嵌入python错误
当我运行 C 代码调用 python 函数时, Py_Initialize() 出现错误 错误是 ImportError: No module named site. 我试图把 Py_SetProgramName(argv[0]) 但它不起作用。cmd调用是cInterfacePython Test.py multiply 3 2 (exe是cInterfacePython)
python - 将 PyInt 转换为 C Int
我需要将 PyInt 转换为 C int。在我的代码中
pValue 是一个 PyObject,PyList。我遇到的问题是 PyList_Size 没有返回正确的列表大小(计数应该是 5,但它给了我 600 万),或者数据类型存在问题,因为我在 C 代码中与 python 脚本接口。理想情况下,我希望 count 是 C int 类型。
我找到了返回长 C 数据类型的 python/c API……这不是我想要的……任何人都可以指出正确的方法或 API?
python - Python C 扩展:使用扩展 PYD 还是 DLL?
我有一个用 C 编写的 Python 扩展,我想知道是否应该在 Windows 下使用文件扩展名 DLL 或 PYD。(我会在 Linux 中使用什么?)
有什么区别(除了文件名)?
我找到了一篇非官方的文章。这就是pyc的秘密吗?为什么我找不到有关此主题的任何官方文章?
python - 将 C 结构传递给 Python 函数
我需要一种简单的方法将 C 结构传递给 Python 函数。我已经将 Python 嵌入到游戏服务器中,我打算用 Python 编写游戏逻辑。我搜索了谷歌和邮件列表,没有发现任何有用的东西。我在 C 中有一个复杂的结构(带有指向其他相对复杂结构的指针)并且没有找到合理的方法来做到这一点。
我有这个结构:
并且需要将它传递给一个 Python 函数,在该函数中我可以使用通用语法轻松访问成员(最好不要使用诸如 dicts 之类的东西,尽管这也可以)。这几乎就像我需要一个 PyObject_FromStruct 函数或其他东西。
有没有相对简单的方法来做到这一点?
python - 使用 pip 时如何设置 distutils 使用的日志级别?
我试图找出error: Unable to find vcvarsall.bat
after的原因是什么pip install greenlet
。我想设置 distutils 使用的日志级别,以便log.debug("Unable to find productdir in registry")
打印调试消息。看了之后,def parse_command_line(self):
我认为pip install --install-option="-vv" greenlet
应该可以工作,但它没有(详细程度仍然为 1)。
我怎样才能做到这一点?
python - 如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?
我注意到几个成熟的 Python 库已经为大多数架构(Win32/Win-amd64/MacOS)和 Python 版本预编译了版本。为不同环境交叉编译扩展的标准方法是什么?葡萄酒?虚拟机?众包?
python - 将布尔值传递给 Python C 扩展的“正确”方法是什么?
这是 python 文档 (http://docs.python.org/extending/extending.html) 中的一个简单示例:
如果我想向函数传递一个额外的布尔参数 - 什么是“正确”的方法?
似乎没有布尔选项可以传递给 PyArg_ParseTuple()。所以我想到了以下几点:
- 读取一个整数并只使用该值(因为 bool 是 int 的子类)
- 对整数调用 PyBool_FromLong()
- 读取和对象并调用 PyBool_Check() 来验证它是一个布尔值
- 也许有一种方法可以获取任何类型的变量并获取其真值(即空数组将是错误的等),这就是 python 函数通常所做的。
这些中的任何一个更可取吗?其他选择?
python - 如何组织和分发带有 C 扩展的 Python 应用程序?
我正在开发一个 Python 应用程序,它作为源代码(压缩)和通过 py2exe(多数)分发。
现在我想通过用 C 扩展替换它们来加速一些模块。这对于开发部分非常有效。但是分布和组织让我很头疼……
我当前的结构如下所示:
我的问题是,我应该在哪里放置 C 扩展的设置调用/文件?我想确保我总是可以通过运行我的应用程序main.py
(所以我宁愿不等到分发编译 C 扩展),但我也想确保分发始终具有最新的 C 扩展。
提前感谢您的帮助!
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?
提前致谢