Tag: python

尝试从C调用Python函数时的Segfault

所以,我想从C调用一个Python回调函数。 在某些时候,函数被发送到C并打包成这样的元组 PyObject *userData = Py_BuildValue(“Oi”,py_callback,some_number); 在那个区域的某个地方,我也做了Py_INCREF(py_callback) 。 在程序的某个稍后时间,我想调用该函数 PyObject *py_callback; int some_number; PyArg_ParseTuple((PyObject*)userData,”Oi”,&py_callback,&some_number); // returns true PyObject *py_result = PyObject_CallFunctionObjArgs(py_callback, /* … */ NULL); 并且最后一次调用会引发分段错误。 你有什么想法,为什么会做这样的事情?

使用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中? 谢谢!

python与c ++使用ctypes

由于我还是新手,我遇到了一些问题,这是我的C ++代码: #include #define DLLEXPORT extern “C” __declspec(dllexport) DLLEXPORT PyObject *Add(PyObject *pSelf, PyObject *pArgs) { int s,d; if(!PyArg_ParseTuple(pArgs, “ii” , &s, &d)) { PyErr_SetString(PyExc_TypeError, “Add() invalid parameter”); return NULL; } return Py_BuildValue(“i”, s + d); } 和Python代码: import ctypes MyDll = ctypes.cdll.LoadLibrary(r”PyToCppTest.dll”) jj = MyDll.Add(1,2) 运行上面的Python代码时出错: OSError:exception:访问冲突读取0x000000000000000A 我希望将数据从Python转换为C ++,然后将其转换为C ++。

如何将SWIG类型映射应用于双指针结构参数

我有一个API,我试图使用SWIG包装,以便我可以从python调用底层的C库。 我遇到了一个特定的API fn: int update_tracks(track_t **phash_tracks, const pdws_t *pdw_frame, const rdws_t *rdw_frame, lib_t *lib, lib_meta_t *lib_meta, const cfg_t *cfg); 它是track_t数据结构的双指针,我无法处理。 所有单指针都可以正常工作。 这是唯一具有指向track_t的双指针的API fn 所有其他只有一个指针,例如 void print_hash_tracks(const track_t *hash_tracks, const cfg_t *cfg, enum TRKTYPE trktype); 我很确定我需要在SWIG界面文件(interface.i)中创建一个类型图,但我发现SWIG文档难以理解。 我认为我需要做的是创建一个类型图,每当它看到track_t**类型时,它需要一个track_t*并将其转换为它的地址,如: /* provide typemap to handle instances of track_t** parameters */ %typemap(in) track_t** (track_t *tracks) { $1 = &tracks; } […]

使用gnome多媒体键无法让dbus信号监听器在C中工作

我正在尝试创建自己的应用程序,它将使用dbus监听gnome中的媒体键。 我找到了一个在python中运行的脚本,我试图通过将其转换为C来使其工作。我的c代码构建并正确运行但它不响应dbus信号。 这个python代码有效: #!/usr/bin/env python “””Printing out gnome multi media keys via dbus-python. “”” import gobject import dbus import dbus.service import dbus.mainloop.glib def on_mediakey(comes_from, what): “”” gets called when multimedia keys are pressed down. “”” print (‘comes from:%s what:%s’) % (comes_from, what) if what in [‘Stop’,’Play’,’Next’,’Previous’]: print (‘Got a multimedia key!’) else: print (‘Got a […]

嵌入Python2和Python3解释器,选择在运行时使用哪一个

有没有一种方法可以将Python2和Python3解释器嵌入到C程序中,然后在运行时决定运行其中一个或另一个? 这是一个示例尝试: Makefile文件: all: main main: main.c librun_in_py2.so librun_in_py3.so g++ main.c -lrun_in_py2 -lrun_in_py3 -L. -Wl,-rpath -Wl,$$ORIGIN -o main librun_in_py2.so: run_in_py2.c g++ $$(python2.7-config –cflags –ldflags) -shared -fPIC $< -o $@ librun_in_py3.so: run_in_py3.c g++ $$(python3.4-config –cflags –ldflags) -shared -fPIC $< -o $@ clean: @-rm main *.so main.c中 void run_in_py2(const char* const str); void run_in_py3(const char* const str); […]

SWIG和C / C ++ Python API连接 – SEGFAULT

我的任务是创建双重程序。 一开始我启动C程序,通过Python的C / C ++ API调用一些Python方法。 之后调用的方法调用使用SWIG创建的函数。 在给出Segmentation fault之后,我还会向你展示我的样本以及来自gdb的回溯。 main.c中: #include #include #include “utils.h” int main(int argc, char** argv) { printf(“Calling from C !\n”); increment(); int i; for(i = 0; i < 11; ++i) { Py_Initialize(); PyObject *pname = PyString_FromString("py_function"); PyObject *module = PyImport_Import(pname); PyObject *dict = PyModule_GetDict(module); PyObject *func = PyDict_GetItemString(dict, "ink"); PyObject_CallObject(func, NULL); […]

使用Python安装信号处理程序

(这里有一个跟进这个问题) 我正在努力为Linux编写一个基于Python的Init系统,但是我在向我的Python init脚本发送信号时遇到了问题。 从’man 2 kill’页面: The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers. 在我的基于Python的Init中,我有一个测试函数和一个信号处理程序设置来调用该函数: def SigTest(SIG, FRM): print “Caught SIGHUP!” signal.signal(signal.SIGHUP, SigTest) 从另一个TTY(init脚本在另一个tty上执行sh)如果我发送一个信号,它将被完全忽略,并且永远不会打印文本。 kill -HUP 1 我发现这个问题是因为我为我的Python init编写了一个收割函数,以便在它们死亡时收获它们的子进程,但它们都只是僵尸,需要一段时间才能弄清楚Python从未得到SIGCHLD信号。 为了确保我的环境是理智的,我写了一个C程序来分叉并让孩子发送PID 1信号并且它确实注册了。 如果signal.signal(SIG, FUNC)不工作signal.signal(SIG, FUNC)如何安装系统将确认的信号处理程序? 我将尝试使用ctypes使用C代码注册我的处理程序,看看是否有效,但如果可能的话,我宁愿回答纯Python。 想法? (我不是程序员,我真的在这里:p) 测试代码如下…… import […]

将python与c集成以提高性能是否合理?

我喜欢几乎所有东西都使用python,并且总是清楚地知道如果由于某种原因我在我的python代码中找到了一个瓶颈(由于python的限制),我总是可以使用集成到我的代码中的C脚本。 但是,当我开始阅读有关如何集成python的指南时。 在文章中,作者说: 有几个原因可能导致人们希望在C或C ++中扩展Python,例如: 在现有库中调用函数。 向Python添加新的内置类型 优化代码中的内部循环 将C ++类库暴露给Python 将Python嵌入C / C ++应用程序中 关于表现没什么。 所以我再问一遍,将python与c集成以获得性能是否合理?

如何从C代码中解开

我有一个计算矩阵的python代码,我想从C代码中使用这个矩阵(或数组或列表)。 我想从python代码中挑选矩阵,并从c代码中取消它,但是我找不到关于如何执行此操作的文档或示例。 我发现了一些关于编组数据的内容,但没有关于从C中拆除的信息。 编辑:评论员彼得H询问我是否正在使用numpy数组。 答案是肯定的。