jjzjj

PyObject

全部标签

c++ - 来自 SWIG PyObject_Call 段错误的 Python 回调

我有一个wx.py.Shell.shell小部件,它允许用户执行与我的程序交互的python代码。我希望能够将用户在此空间中定义的函数传递到我的C++代码(通过wxswig生成的围绕我的自定义小部件的包装器)并执行它。在我的C++代码中,我使用std::function类来调用绑定(bind)函数(C++或Python)所以我创建了一个简单的类来用函数调用运算符包装PyObject。但是,当我尝试调用PyObject*时出现段错误。classPyMenuCallback{PyObject*Func;public:PyMenuCallback(constPyMenuCallback&op

python - 如何处理 Python 扩展上的 uint8_t?

我想在我的C模块中传递一个uint8_t数组作为函数的参数。我找不到直接解析此数组的方法,因此我将其解析为PyObject_t,然后作为PyTuple_t对象进行迭代。这样,我需要将此元组的每个元素PyObject_t转换为uint8_t。如果没有PyInt_FromUINT8_t函数或类似函数,我该怎么做? 最佳答案 您通常可以使用unsignedchar来摆脱B。根据ParsingArguments你应该能够做到:uint8_tb;if(!PyArg_ParseTuple("b",&b)){returnNULL;}如果不直接使用

python - 函数作为 Python 中的对象 : what exactly is stored in memory?

我已经使用Python解决实际问题有一段时间了,但我仍然没有对幕后发生的事情有正确的理论理解。例如,我很难理解Python如何将函数视为对象。我知道函数是“函数”类的对象,带有“调用”方法,并且我知道我可以通过为它们编写“调用方法”来使我的自定义类表现得像函数。但是我无法弄清楚在创建新函数时确切地存储在内存中的内容,以及如何访问存储的信息。为了进行实验,我编写了一个小脚本来创建许多函数对象并将它们存储在一个列表中。我注意到这个程序用了很多内存。funct_list=[]foriinrange(10000000):deffunct(n):returnn+ifunct_list.appen

python - 用 C : Pass a list to PyArg_ParseTuple 扩展 python

我一直在努力掌握使用C扩展python,到目前为止,基于documentation,我在编写小型C函数并使用Python扩展它方面取得了相当大的成功。但是,我现在遇到了一个相当简单的问题-我无法找到解决方案。所以,我想做的是将一个doublelist传递给我的C函数。例如,要传递int,我会执行以下操作:intsquared(intn){if(n>0)returnn*n;elsereturn0;}staticPyObject*squaredfunc(PyObject*self,PyObject*args){intn;if(!PyArg_ParseTuple(args,"i",&n))r

python - 为什么逐行复制文件会极大地影响 Python 中的复制速度?

不久前,我制作了一个类似于此的Python脚本:withopen("somefile.txt","r")asf,open("otherfile.txt","a")asw:forlineinf:w.write(line)当然,这在100mb文件上运行得相当慢。但是,我改变了程序来做到这一点ls=[]withopen("somefile.txt","r")asf,open("otherfile.txt","a")asw:forlineinf:ls.append(line)iflen(ls)==100000:w.writelines(ls)dells[:]文件复制速度更快。我的问题是,为什么

python - 将 matplotlib 图表嵌入到 Qt/C++ 应用程序中

我正在使用Qt/C++开发面向数学的GUI应用程序,并希望嵌入Python脚本,包括NumPy和Matplotlib。使用PythonCAPI,我终于设法运行了一个脚本,从Python变量中检索值,包括NumPy数组等。但是我未能将Matplotlib图表绘制到我的Qt/C++应用程序中。更好的说法是,我已经设法使用Python脚本将图表的RGBA缓冲区保存到一个变量,然后将变量的值作为缓冲区类型的PyObject获取,获取缓冲区并将其转换为QImage,然后再转换为QPixmap最后放入QLabel中显示。但我仍然缺少它的交互行为,调整大小等。虽然它似乎可以通过将Qt鼠标事件转发到f

python - 从 c 字符数组创建 PyString 而不复制

我有一个来自C应用程序的大字符串缓冲区(基本上是12GB)。我想在不复制字符串的情况下为嵌入式Python解释器在C中创建PyString对象。这可能吗? 最佳答案 我认为这是不可能的,因为PythonString对象被嵌入到PyObject结构中。换句话说,Python字符串对象是PyObject_HEAD后跟字符串的字节。您必须在内存中留出空间来将PyObject_HEAD信息放在现有字节周围。 关于python-从c字符数组创建PyString而不复制,我们在StackOverfl

python - Boost.Python 向现有 PyObject 添加绑定(bind)(用于异常处理)

为了以实际可行的方式向Python公开C++异常,您必须编写如下内容:std::stringscope=py::extract(py::scope().attr("__name__"));std::stringfull_name=scope+"."+name;PyObject*exc_type=PyErr_NewException(&full_name[0],PyExc_RuntimeError,0);//...但这似乎不会与Boost.Python中的任何其他内容交互。如果我想公开:structError{intcode;};我可以写:py::class_("Error",py::n

python - 通过 C API 从字符串创建和调用 python 函数

是否可以从字符串加载python函数,然后使用参数调用该函数并获取返回值?我正在使用pythonCAPI从我的C++应用程序中运行python代码。我可以使用PyImport_Import从文件加载模块,使用PyObject_GetAttrString从文件中获取函数对象,然后使用PyObject_CallObject调用函数.我想做的是从字符串而不是文件加载模块/函数。是否有一些等同于PyImport_Import的东西可以让我向它传递一个字符串而不是一个文件?我需要将参数传递给我正在调用的函数并且我需要访问返回值,所以我不能只使用PyRun_SimpleString。编辑:我在打开

python - 如何获取 PyObject 的引用计数?

如何从C++获取PyObject的引用计数?有函数Py_INCREF和Py_DECREF可以增加/减少它,但我还没有找到返回对象引用计数的函数。我需要它来进行调试。 最佳答案 每个对象的引用计数都存储在PyObject本身的一个名为ob_refcnt的变量中.您可以直接访问它。typedefstruct_object{_PyObject_HEAD_EXTRAPy_ssize_tob_refcnt;#Referencecountstruct_typeobject*ob_type;}PyObject;或者,您可以使用Py_REFCNTM