Tag: python c api

在c中读取python的全局变量

我正在努力学习如何正确使用Python / C API – 我真正需要做的就是读取一个全局变量(在我的案例中是字典 – 但我从一个简单的整数变量开始)。 使用讨论: 如何从C访问Python全局变量? 那里的答案来源: http : //bytes.com/topic/python/answers/705918-c-api-embedded-python-how-get-set-named-variables我写了这个小东西: Python代码(tryStuff.py): var1 = 1 var2 = [‘bla’, ‘blalba’] var3 = {“3” : “Three”, “2” : “Two”, “1” : “One”, “0” : “Ignition!”} print “end of file – tryStuff!!” C代码(embedPythonTry.c): #include int main(int argc, char **argv){ Py_Initialize(); PyRun_SimpleString(“import sys”); PyRun_SimpleString(“sys.path.append(”)”); PyImport_ImportModule(“tryStuff”); printf(“After […]

嵌入式Python 2.7.2从用户定义的目录导入模块

我将Python嵌入到将具有已定义API的C / C ++应用程序中。 应用程序需要实例化脚本中定义的类,其结构大致如下: class userscript1: def __init__(self): ##do something here… def method1(self): ## method that can be called by the C/C++ app…etc 我过去曾经管理过(为了概念validation)使用以下类型的代码完成这项工作: PyObject* pName = PyString_FromString(“userscript.py”); PyObject* pModule = PyImport_Import(pName); PyObject* pDict = PyModule_GetDict(pModule); PyObject* pClass = PyDict_GetItemString(pDict, “userscript”); PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 现在我处于更多的生产环境中,这在PyImport_Import行失败了 – 我想这可能是因为我正在尝试将目录添加到脚本名称,例如 PyObject* pName = PyString_FromString(“E:\\scriptlocation\\userscript.py”); 现在,为了让您了解我尝试过的内容,我尝试在所有这些调用之前修改系统路径以使其搜索此模块。 […]

Python C-API对象分配

我想使用new和delete运算符来创建和销毁我的对象。 问题是python似乎将其分解为几个阶段。 用于创建的tp_new,tp_init和tp_alloc以及用于销毁的tp_del,tp_free和tp_dealloc。 但是c ++只有new,它分配并完全构造对象和删除对象的析构和解除分配。 我需要提供哪些python tp_ *方法以及它们必须做什么? 此外,我希望能够直接在c ++中创建对象,例如“PyObject * obj = new MyExtensionObject(args);” 我是否还需要以某种方式重载新运算符以支持此操作? 我也希望能够在python中inheritance我的扩展类型,我需要做些什么来支持它? 我正在使用python 3.0.1。 编辑:好的,tp_init似乎使对象有点太可变了我正在做的事情(例如,使用一个Texture对象,在创建后更改内容很好,但更改它的基本方面,如size,bitdept等会破坏很多现有的c ++东西都假定了那些东西是固定的)。 如果我不实现它,它只会阻止人们在构造之后调用__init__(或者至少忽略调用,就像元组一样)。 或者,如果在同一对象上多次调用tp_init,我是否应该有一些抛出exception或某事的标志? 除此之外,我认为其余的大部分已经排序。 extern “C” { //creation + destruction PyObject* global_alloc(PyTypeObject *type, Py_ssize_t items) { return (PyObject*)new char[type->tp_basicsize + items*type->tp_itemsize]; } void global_free(void *mem) { delete[] (char*)mem; } } template class ExtensionType { PyTypeObject […]

嵌入python

我试图从C代码调用python函数,我从这里跟随样本 我也有正确的包含文件目录,库目录,并链接python32.lib(即时使用python 32)但是错误是python / C API,如PyString_FromString,PyInt_FromLong,PyInt_AsLong未定义(调试器中的错误) 这很奇怪,因为我也使用其他API,但它们都很好…… 这是什么问题? int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; int i; if (argc < 3) { fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); return 1; } Py_Initialize(); pName = PyString_FromString(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule […]

使用C API创建在python中声明的python类的实例

我想创建一个使用C API在__main__范围内定义的Python类的实例。 例如,该类称为MyClass ,定义如下: class MyClass: def __init__(self): pass 类类型位于__main__范围内。 在C应用程序中,我想创建此类的实例。 这可能是PyInstance_New可以实现的,因为它需要类名。 但是这个function在Python3中不可用。 任何对替代品的帮助或建议都表示赞赏。 谢谢,保罗

numpy数组C api

我有一个C ++函数返回一个std :: vector,我想在python中使用它,所以我使用的是C numpy api: static PyObject * py_integrate(PyObject *self, PyObject *args){ … std::vector integral; cpp_function(integral); // This changes integral npy_intp size = {integral.size()}; PyObject *out = PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, &(integral[0])); return out; } 这是我从python中调用它的方式: import matplotlib.pyplot as plt a = py_integrate(parameters) print a fig = plt.figure() ax = fig.add_subplot(111) ax.plot(a) print a 会发生什么:第一次打印没问题,值是正确的。 […]

Numpy C-Api示例给出了SegFault

我试图理解Python C-Api是如何工作的,我想在Python和C扩展之间交换numpy数组。 所以,我开始了这个教程: http : //dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html 试图在那里做第一个例子,计算2d numpy数组的跟踪的C模块对我来说非常整洁,因为我也想在2d数组中进行基本操作。 #include #include “Numeric/arrayobject.h” #include int main(){ Py_Initialize(); import_array(); } static char doc[] = “This is the C extension for xor_masking routine”; static PyObject * trace(PyObject *self, PyObject *args) { PyObject *input; PyArrayObject *array; double sum; int i, n; if (!PyArg_ParseTuple(args, “O”, &input)) return NULL; array = (PyArrayObject […]

Python C API不加载模块

我正在尝试使用C API加载包含C中的math和numpy导入的python模块。 我可以加载并运行模块但是,如果我导入数学模块它不起作用。 我正在使用Arch Linux,Python 2.7.2和gcc。 这里的代码: #include #include #include int main(int argc, char **argv) { PyObject *pName, *pModule, *pFunc, *pArg, *pDict, *pReturn, *pT1, *pT2, *pX, *pY; int i; double x, y; Py_Initialize(); PySys_SetPath(“.”); pName = PyString_FromString(“func”); if (!pName) { printf(“pName\n”); return 0; } pModule = PyImport_Import(pName); pDict = PyModule_GetDict(pModule); pFunc = PyDict_GetItemString(pDict, “get_vals”); pArg […]