Tag: python c api

我怎样才能从Python C代码断言?

我正在用C编写Python类,我想在我的调试代码中加入断言。 assert.h适合我。 这只会放入调试编译中,因此不会有断言失败影响Python代码的用户*。 我试图划分我的’库’代码(它应该与链接到Python的代码分开),所以我可以从其他C代码中使用它。 因此,我的Python方法是我的纯C代码的简洁包装。 所以我不能在我的’库’代码中执行此操作: if (black == white) { PyErr_SetString(PyExc_RuntimeError, “Remap failed”); } 因为这会使用Python污染我的纯C代码。 它也比简单的更丑陋 assert(black != white); 我相信Distutils编译器总是设置NDEBUG ,这意味着即使在调试版本中我也不能使用assert.h 。 Mac OS和Linux。 救命! *我听过一个论点反对在Python中调用C代码断言。

使用Django / PyISAPIe / IIS时,大的POST数据已损坏

使用Django 1.2.3,PyISAPIe v1.1.0-rc4和IIS 7.5时,我遇到了大POST数据(> 16384字节)的问题。 例如,提交约。 使用POST的60kB表单数据,发生以下情况: 第一个16kB的POST数据块是正确的 下一个16kB块是第一个块的重复 接下来的16kB是第一个块的另一个重复 剩下的(<16kB)再次正确 有趣的是,当使用content-type=”multipart/form-data” ,它工作正常。 使用此信息,我在django \ core \ handlers \ wsgi.py中跟踪了错误的可能位置到WSGIRequest._get_raw_post_data,它与默认值分开处理content-type=”multipart/form-data” (无内容类型) ) 案件。 这两种情况都是从self.environ[‘wsgi.input’]读取的,它被设置为PyISAPIe对象。 区别在于默认情况似乎是以16kB的块读取,而多部分处理程序似乎读取的块数略低于2GB。 我不太了解C和Python的C接口以进一步挖掘,但我猜这个bug是在ReadWrite.cpp的ReadClient函数中的PyISAPIe中的某个地方。 我目前的解决方法是将content-type=”multipart/form-data”到可能产生超过16kB数据的表单中。 有没有人遇到这个,或者有人知道如何确定这个错误是否实际上在PyISAPIe中? 谢谢!

集成C和Python:ValueError:模块函数不能设置METH_CLASS或METH_STATIC

我正在第一次尝试集成C和Python 2.7.3。 首先,我只是想为Python编写一个可以进行基本添加的C模块。 (它被称为npfind,因为一旦我弄明白了,我想为numpy编写一个find方法) npfind.h: #include extern int add(int a, int b); npfind.c: #include “npfind.h” int add(int a, int b) { return a + b; } pynpfind.c: #include “Python.h” #include “npfind.h” static char* py_add_doc = “Adds two numbers.”; static PyObject* py_add(PyObject* self, PyObject* args) { int a, b, r; if (!PyArg_ParseTuple(args, “ii”, &a, &b)) { […]

从Python C扩展中导入和使用标准Python模块

我有用C编写的Python扩展模块。我想在这个C代码中使用标准Python模块之一,例如os或shutil 。 怎么做到这一点最好?

如何在Python中重定向stderr? 通过Python C API?

这是我最近两个问题的组合: [1] C中的Python实例方法 [2] 如何在Python中重定向stderr? 我想从python脚本中记录stdout和stderr的输出。 我想问的是,根据[1]创建一个新类型似乎相当复杂。 如果不需要将新类型暴露给Python,它是否简化了事情,即它只存在于C中? 我的意思是,当Python打印出来的东西时,它会转到“Objects / fileobject.c”,然后在“PyFile_WriteObject”中检查它是否可以写入其参数: writer = PyObject_GetAttrString(f, “write”); if (writer == NULL) … 此外,有可能像这样得到stdout和stderr: PyObject* out = PySys_GetObject(“stdout”); PyObject* err = PySys_GetObject(“stderr”); 我的问题是,是否有可能构造必要的PyObject,它满足上面的’PyObject_GetAttrString(f,“write”)’并且可以调用,所以我可以写: PySys_SetObject(“stdout”, ); http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject 这样,就没有必要将新的“writer类型”暴露给Python脚本的其余部分,所以我认为编写代码可能会有点简单……?

嵌入时Python 3解释器是否会泄漏内存?

此错误报告指出,截至2007年6月,Python解释器在使用嵌入式Python解释器的C / C ++应用程序中调用Py_Finalize后,将不会清除所有已分配的内存。 建议在应用程序终止时调用Py_Finalize一次。 此错误报告指出,从版本3.3和2011年3月开始,解释器仍会泄漏内存。 有谁知道这个问题的当前状态? 我很担心,因为我有一个应用程序,其中每个运行实例多次调用解释器,我遇到内存泄漏。 我已经使用boost :: python来处理引用计数,并清除了在运行之间运行Python程序所创建的所有引用的全局字典。 我有一些单身人士课 – 这可能是问题吗? 这是一个易处理的问题还是Python解释器中的错误?

从C创建一个实现__dict__的Python类型?

根据“正常”类创建的__dict__类型是如何在Python中定义的? 有没有__dict__ s的非动态类型的例子? 通过Python的type_new定义的类型是否通过type_new ? tp_dict有一个tp_dict成员,但我找不到有关如何使用它的信息。 在typeobject.c的type_new似乎也有一些事情发生,但我无法清楚地解读它。 以下是我发现的一些相关信息: inheritance自C扩展模块的类中的__dict__ 如何在Python中实现__slots__?

在Python中,为什么用C语言实现的模块比纯Python模块更快,我怎么写一个?

python文档说,cPickle比Pickle快的原因是,前者是用C实现的。这究竟是什么意思? 我正在使用Python制作高级数学模块,有些计算需要花费大量时间。 这是否意味着如果我的程序在C中实现,它可以更快? 我希望从其他Python程序导入这个模块,就像我可以导入cPickle一样。 你能解释一下如何在C中实现Python模块吗?

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);

Python C API如何将结构数组从C传递给Python

对于我正在创建的python模块,我想向python用户传递一个这样的结构数组: struct tcpstat { inet_prefix local; inet_prefix remote; int lport; int rport; int state; int rq, wq; int timer; int timeout; int retrs; unsigned ino; int probes; unsigned uid; int refcnt; unsigned long long sk; int rto, ato, qack, cwnd, ssthresh; }; 我认为Py_BuildValues是我正在寻找的function。 但似乎不是。 查看Python文档,我找到了缓冲协议 。 但这是我第一次开发python模块,官方文档对我没什么帮助。 缓冲协议是我问题的最佳解决方案吗? 如果是这样,我怎么能将我的数组从C返回到python?