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

python - Python C 扩展 - 维护状态

我需要用 C 语言编写一个 Python 扩展,用于:

  1. 对文件执行 CPU 密集型初始化;
  2. 进行多个依赖于初始化数据的函数调用以将结果返回给我;和
  3. 完成后释放内存

一种解决方案是在 Python 中实现“状态持有者”类。当我在 C 中调用初始化时,它会返回我将存储在 Python 状态对象中的初始化数据。然后每次我需要执行第 (2) 步时,我都会将其传递给 C 函数。但这似乎非常低效,因为 Python 端和 C 端之间发生的所有数据穿梭/接口。

如果可能的话,我想使用 C 端的状态对象来维护状态。Python 端的初始化调用不会返回所有初始化数据,而只会返回一个 ID,以便在后续调用期间需要时引用 C 状态对象。

我将如何维护 C 端的状态?

0 投票
1 回答
649 浏览

xcode - Python C 扩展和 Xcode 4.5

我想使用 XCode 4.5.2 创建一个 python C 扩展,以便我可以使用 xcode 调试器。扩展要求将 C 文件链接为 .so 文件。我无法在 xcode 中制作 .so 文件,只能制作 dylib 文件。

我尝试如下:1.使用C/C++库模板,指定动态库2.将Mach-O类型更改为Bundle 3.仍然无法制作.so所以我将包装器扩展名更改为.so,没有运气.

下面的帖子链接似乎说我可以手动更改扩展名。这对我不起作用,但我可能会犯另一个错误。

如何让python在osx上加载dylib

对我的问题有什么想法吗?

0 投票
0 回答
59 浏览

compilation - 重新编译会影响正在运行的程序吗?

如果我在程序仍在运行时重新编译,程序是否仍会像重新编译前一样执行?

我只是从运行时重新编译可执行文件是否安全?,但我有一个更复杂的情况:

我正在开发一个带有 C 扩展名的 python 包;

我可以只重新编译该 C 扩展中的共享对象;

我将不得不通过“qsub”将其提交到队列中......

谢谢!

0 投票
1 回答
707 浏览

python - 将二进制数据从 python 2.7 获取到 C 模块的正确方法是什么

我正在从 python 文件中读取二进制数据并尝试将该数据发送到 ac 模块。在python中,数据是这样读取的

如果可能,我希望将数据作为指向缓冲区的指针和 c 中的长度。我正在使用 PyArg_ParseTuple 来获取 c 模块中的参数。我注意到在 python 3+ 中有二进制数据的 ay/y*/y# 格式说明符,但我需要在 python 2.7 中使用等效的方法。

谢谢

0 投票
1 回答
2175 浏览

python - PyEval_InitThreads 什么时候应该被调用?

我对什么时候应该打电话有点困惑PyEval_InitThreads。一般来说,我知道PyEval_InitThreads每当使用非 Python 线程(即在扩展模块中产生的线程)时都必须调用它。

但是,我很困惑PyEval_InitThreads是嵌入 Python 解释器的 C 程序,还是导入 C 扩展模块的 Python 程序,或者两者兼而有之。

那么,如果我编写一个将在内部启动线程的 C 扩展模块,我是否需要PyEval_InitThreads在初始化模块时调用?

此外,PyEval_InitThreads 隐式获取 Global Interpreter Lock。所以在调用之后PyEval_InitThreads,大概 GIL 必须被释放,否则就会出现死锁。那么如何释放锁呢?阅读文档后,PyEval_ReleaseLock()似乎是释放 GIL 的方式。但是,在实践中,如果我在 C 扩展模块中使用以下代码:

...然后在运行时 Python 中止:

那么你如何在获得 GIL 后释放它PyEval_InitThreads呢?

0 投票
0 回答
640 浏览

python - 在 Python 扩展模块中将标准输入设置为宽字符方向

在 C Python 扩展模块中,我使用了一个库,它可以执行fwide(stdin,1). 这导致EOFErrorinput()在 Python 代码中调用。当我避免fwide(stdin,1)使用模块的 C 代码时,python 代码可以正常工作。

问题是,是否可以让 python 与宽字符一起工作stdin,还是必须stdin为 Python 保留窄字符模式?这是 Python 中的一个错误(它似乎不介意stdout设置为宽还是窄)?

这是 Python 3,我不知道 python 2 是否有相同的行为。

0 投票
1 回答
1164 浏览

python - Python 中的 C 扩展:将 wchar 字符串转换为 Python 值

在 Python 的 C 扩展中,我可以使用Py_BuildValue()将 char 字符串转换为 Python 值,如下所示Py_BuildValue("s", str):但是,如果字符串是 wchar 数组,则Py_BuildValue("s", str)不能使用。

我想我可以像这样使用 PyUnicode:

但是,它不起作用。如何将 wchar 字符串转换为 Python 值?

0 投票
1 回答
885 浏览

python - 无法使用 c 调用 python 引用 Py_Initialize

我想用 ac 程序调用一个 python 程序,

操作系统:ubuntu 12.10 x64 python2.7.3

C代码:

编译外壳:

0 投票
1 回答
636 浏览

python - Python C-ext 命名空间与常规 python 子模块混合?

这个问题与以下内容有一些相似之处:

嵌套的 Python C 扩展/模块?

只有轻微的扭曲。在这里,我不是想混合两个 C-ext,而是一个 C-ext 和一个常规的 python 子模块。

C-extension 有没有办法在符号“module.so”和子模块中的符号之间共享模块命名空间?

我的模块结构如下所示:

如果我从层次结构中删除“utils”,我可以导入 facs 并查看facs.so方法:

但是,当我将 utils 子模块放回原处并尝试导入不同的部分时,一个命名空间似乎掩盖了另一个命名空间(utils掩盖了由 导出的符号facs.so):

如您所见, after dir(facs), build, queryandremove消失了,并且galaxy 没有正确导入,除非我执行 afrom facs.utils import galaxy而不是重新使用初始 import 语句并直接访问 via facs.utils.galaxy.rsync_genomes()

总而言之,我对这个模块的预期用途是:

(目前正在开发中)代码位于:

https://github.com/brainstorm/facs/tree/develop

万一有人想自己尝试一下。我正在使用 virtualenvs,我的 $PYTHONPATH 似乎是正确的:

安装似乎也成功了:

似乎没有__init__.py文件实际上被复制到顶级目录,但是在那里触摸它不会影响上述导入行为。

有任何想法吗?提前致谢!

0 投票
2 回答
1393 浏览

python - 在 pyx/pxd 文件中使用函数工厂为 C 库生成 cython 函数包装器

我正在重新评估将外部 C 库包装到 Python 中的不同方法。我很久以前就选择使用简单的 Python C API,它快速、简单、独立,而且,正如我所想的那样,它是面向未来的。然后我偶然发现了PyPy,它显然不打算支持 CPython API,但将来可能会成为一个有趣的替代方案......因此我正在寻找更高级别的入口点。ctypes速度很慢,所以现在我又回到了cython,这似乎在努力支持 PyPy。

我的库有许多具有相同签名的函数,因此我广泛使用 C 预处理器宏来生成 Python 模块。我认为这在 cython 中会变得更舒服,因为我可以访问整个 Python 语言。但是,我在为我的函数包装器编写工厂时遇到了麻烦:

cython 编译器抱怨:“这里不允许 C 函数定义”,指的是cpdef内部_fun_factory。这里有什么问题?我认为pyx文件就像普通的 python 文件一样。除了从单独的 python 脚本动态生成文件之外,有没有办法让它工作pyx,例如setup.py

我也很惊讶 cython 不允许我这样做:

清理代码。为什么这不起作用?

我知道那里有自动C -> cython翻译器,但我不愿意让自己依赖这样的第 3 方工具。但是,如果您认为它已准备好用于生产,请随时提出建议。