Tag: cpython

python – 如何将装饰器应用于用C编写的Python函数?

喜欢微博回答,但会接受CPython 我在C中实现了一个Python函数。 你如何将装饰器应用于用C编写的Python函数?

Python C模块 – Malloc在特定版本的Python中失败

我正在编写一个Python模块来在O_DIRECT上下文中执行IO。 O_DIRECT的一个限制是你必须读入对应于2.4和2.5内核的4096字节边界的缓冲区,2.6及以上将接受512的任意倍数。 显而易见的内存分配候选是posix_memalign(void **memptr, size_t alignment, size_t size) 在我的代码中,我分配了一个像这样的区域: char *buffer = NULL; int mem_ret = posix_memalign((void**)&buffer, alignment, size); if (!buffer) { PyErr_NoMemory(); return NULL; } /* I do some stuff here */ free(buffer); 当我用python3.2编译和导入模块时,这个(以及未示出的模块的其余部分)工作正常。 当我尝试使用python2.7(我想保持兼容性)时,它会抛出PyErr_NoMemoryexception,而mem_ret == ENOMEM表示它无法分配。 为什么我编译的Python版本会影响posix_memalign的运行方式? 操作系统:Ubuntu 12.04 LTS 编译器:Clang + GCC显示相同的行为 UPDATE 感谢user694733,我现在有了一段代码 然而它工作的事实让我更加困惑: #if PY_MAJOR_VERSION >= 3 char *buffer = […]

PyFile_Type替换为..?

我正在为Python 3.2编译Yenc 。 我注意到gcc抱怨一个非声明的函数PyString_Type ,所以我用替换的PyBytes_Type替换它,如文档所示 。 然而,gcc还抱怨称为PyFile_Type的未声明函数。 我google了一下,发现: Python 3.x replaces the PyFile_Type extension type with an abstract interface and specific implementation types. Unfortunately it doesn’t make any of this directly available with a C level api. 资源 我绝不是一个C程序员,这让我无法解决这个问题。 我该怎么做才能解决这个问题? 编辑: 编译输出 , _yenc.c 谢谢!

我们如何将C结构传递给Python?

我是C和Python的新手。 这些天,我正在学习在C中嵌入Python。当我从C调用Python函数时,我想知道,我们如何将C结构传递给Python? 非常感谢!

从C线程调用Python代码

当从C(或C ++)线程调用Python代码时,我对如何确保线程安全性感到非常困惑。 Python文档似乎在说,通常这样做的习惯是: PyGILState_STATE gstate; gstate = PyGILState_Ensure(); /* Perform Python actions here. */ result = CallSomeFunction(); /* evaluate result or handle exception */ /* Release the thread. No Python API allowed beyond this point. */ PyGILState_Release(gstate); 事实上,这个stackoverflow答案似乎也证实了这一点。 但是一位评论者(声誉很高)却说不然。 评论者说你应该使用PyEval_RestoreThread() / PyEval_SaveThread() 。 文档似乎证实了这一点: PyThreadState* PyEval_SaveThread() Release the global interpreter lock (if it has been […]

Python:GIL上下文 – 切换

所以,我通常非常了解Python中的全局解释器锁 (GIL)是如何工作的。 本质上,当解释器运行时,一个线程保持GIL为N刻度(其中N可以使用sys.setcheckinterval设置),此时GIL被释放而另一个线程可以获取GIL。 如果一个线程开始I / O操作,也会发生这种情况。 我有点困惑的是这一切是如何与C扩展模块一起工作的。 如果你有一个C扩展模块获取GIL,然后使用PyEval_EvalCode执行一些python代码,解释器PyEval_EvalCode可以释放GIL并将其提供给其他线程? 或者,获取GIL的C线程是否会永久保持GIL,直到PyEval_EvalCode返回并且GIL在C中明确释放? PyGILState gstate = PyGILState_Ensure(); …. /* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */ PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); PyGILState_Release(gstate);

内置“in”运算符的Python源代码

我试图在(C)Python源代码中找到内置运算符的实现。 我在内置函数源代码bltinmodule.c中搜索过 ,但是找不到这个运算符的实现。 我在哪里可以找到这个实现? 我的目标是通过扩展此搜索的不同C实现来改进Python中的子字符串搜索,尽管我不确定Python是否已经使用了我的想法。