Tag: python

如果字符串中有非ASCII字符,如何将C字符串(char数组)转换为Python字符串?

我在C程序中嵌入了一个Python解释器。 假设C程序从文件中读取一些字节到char数组,并且(以某种方式)学习字节表示具有特定编码的文本(例如,ISO 8859-1,Windows-1252或UTF-8)。 如何将此char数组的内容解码为Python字符串? Python字符串通常应该是unicode类型 – 例如,Windows-1252编码输入中的0x93变为u’\u0201c’ 。 我试图使用PyString_Decode ,但是当字符串中有非ASCII字符时它总是会失败。 这是一个失败的例子: #include #include int main(int argc, char *argv[]) { char c_string[] = { (char)0x93, 0 }; PyObject *py_string; Py_Initialize(); py_string = PyString_Decode(c_string, 1, “windows_1252”, “replace”); if (!py_string) { PyErr_Print(); return 1; } return 0; } 错误消息是UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u201c’ in position 0: […]

通过Ctypes从C到Python – 将函数指针的结构包装到静态函数

我有一个像这样的C库中的结构。 DataFn中的函数指针指向静态函数。 。H struct Data { int i; int *array; }; typedef struct { bool (* const fn1) (struct Data*, const char *source); …. } DataFn; extern DataFn const DATAFUNC 使用objdump,该表仅包含DATAFUNC和gcc中的一些其他内容。 这在C中很好,其中调用fn1就像DATAFUNC.fn1(…,…),但是这样的东西怎么会被包裹起来所以fn1可以用python w / ctypes调用? 示例python libc = ctypes.cdll.LoadLibrary(“./data.so”) print(libc.DATAFUNC) 导致 这是类似的,但没有工厂function。

编译器找不到Py_InitModule()..它是否已被弃用,如果是这样,我应该使用什么?

我正在尝试为python编写C扩展。 使用代码(如下),我收​​到编译器警告: implicit declaration of function ‘Py_InitModule’ 它在运行时失败并出现此错误: undefined symbol: Py_InitModule 我花了几个小时寻找一个没有快乐的解决方案。 我尝试过多次语法修改,我甚至发现一篇post暗示该方法已被弃用。 但是我发现没有替代品。 这是代码: #include //a func to calc fib numbers int cFib(int n) { if (n<2) return n; return cFib(n-1) + cFib(n-2); } static PyObject* fib(PyObject* self,PyObject* args) { int n; if (!PyArg_ParseTuple(args,"i",&n)) return NULL; return Py_BuildValue("i",cFib(n)); } static PyMethodDef module_methods[] = { […]

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 […]

在C / C ++中使用Python代码

我在嵌入式Linux环境中工作,我有一些我想使用的Python代码。 我的Python代码只是在做一些数学运算,而不是使用Numpy以外的任何库和常用的库。 有没有办法建立一个我可以用C或C ++代码调用的库?

从C ++调用Python

我正在尝试从我的主要C ++程序中调用Python脚本中的函数。 python函数接受一个字符串作为参数并且不返回任何内容(ok ..’None’)。 只要前一次调用在再次调用函数之前完成,它就完美地工作(从未想过会那么容易……),否则在pModule = PyImport_Import(pName)处存在访问冲突。 有很多教程如何在C中嵌入python,反之亦然,但我没有发现这个问题。 int callPython(TCHAR* title){ PyObject *pName, *pModule, *pFunc; PyObject *pArgs, *pValue; Py_Initialize(); pName = PyUnicode_FromString(“Main”); /* Name of Pythonfile */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, “writeLyricToFile”); /* function name. pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pArgs […]

访问PyObject的底层结构

我正在创建一个python c扩展,但很难找到我想做的文档。 我基本上想要创建一个指向cstruct的指针,并能够访问该指针。 示例代码如下。 任何帮助,将不胜感激。 typedef struct{ int x; int y; } Point; typedef struct { PyObject_HEAD Point* my_point; } PointObject; static PyTypeObject PointType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ “point”, /*tp_name*/ sizeof(PointObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash […]

Python ctypes和函数调用

我的朋友制作了一个适用于x86的小型概念validation汇编程序。 我决定将它移植到x86_64,但我立即遇到了问题。 我在C中编写了一小段程序,然后编译并objdumped代码。 之后我将它插入到我的python脚本中,因此x86_64代码是正确的: from ctypes import cast, CFUNCTYPE, c_char_p, c_long buffer = ”.join(map(chr, [ #0000000000000000 : 0x55, # push %rbp 0x48, 0x89, 0xe5, # mov %rsp,%rbp 0x48, 0x89, 0x7d, 0xf8, # mov %rdi,-0x8(%rbp) 0x48, 0x8b, 0x45, 0xf8, # mov -0x8(%rbp),%rax 0x48, 0x83, 0xc0, 0x0a, # add $0xa,%rax 0xc9, # leaveq 0xc3, # retq ])) […]

使用ctypes将2d numpy数组传递给c

使用ctypes将numpy 2d – 数组传递给ac函数的正确方法是什么? 到目前为止我的当前方法(导致段错误): c代码: void test(double **in_array, int N){ int i,j; for(i = 0; i<N; i++){ for(j = 0; j<N; j++){ printf("%e \t", in_array[i][j]); } printf("\n"); } } python代码: from ctypes import * import numpy.ctypeslib as npct array_2d_double = npct.ndpointer(dtype=np.double,ndim=2, flags=’CONTIGUOUS’) liblr = npct.load_library(‘libtest.so’, ‘./src’) liblr.test.restype = None liblr.test.argtypes = [array_2d_double, c_int] x […]

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

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