Tag: python

Python C扩展:PyEval_GetLocals()返回NULL

我需要在C / C ++中从Python读取局部变量。 当我尝试PyEval_GetLocals ,我得到一个NULL。 尽管Python已初始化,但会发生这种情况 以下是一个最小的例子。 #include #include Py_Initialize(); PyRun_SimpleString(“a=5”); PyObject *locals = PyEval_GetLocals(); std::cout<<locals<<std::endl; //prints NULL (prints 0) Py_Finalize(); 在手册中 ,它表示如果没有帧正在运行它会返回NULL,但是……正在运行一个帧! 我究竟做错了什么? 我在Debian Jessie中运行它。

为什么Python的导入不能像C的#include一样工作?

我一直在试图理解Python导入大约一年了,而且我已经放弃了Python中的编程,因为它看起来似乎太混淆了。 我来自C背景,我认为import就像#include一样,但如果我尝试导入某些东西,我总会得到错误。 如果我有两个这样的文件: foo.py: a = 1 bar.py: import foo print foo.a input() 为什么需要引用模块名称? 为什么不能只编写import foo , print a ? 这种混乱有什么意义? 为什么不运行代码并为您定义的东西,就像您在一个大文件中编写它一样? 为什么它不能像C的#include指令一样工作,它基本上复制和粘贴你的代码? 我在C中没有导入问题

Python Ctypes传入指针并获得结构

这是我在解决实际有用问题之前尝试工作的一个简单示例。 C代码: typedef struct { uint32_t seconds; uint32_t nanoseconds; } geoTime; int myTest(geoTime *myTime){ printf(“Time: %d %d\n”, myTime->seconds, myTime->nanoseconds); myTime->seconds = myTime->nanoseconds; geoTime T = {314, 159}; printf(“MyTime: %d %d retValue: %d %d\n”, myTime->seconds, myTime->nanoseconds, T.seconds, T.nanoseconds); return 314; } Python代码: import ctypes import time import math lib_astro = ctypes.CDLL(“libastroC.so”) class geoTime(ctypes.Structure): _fields_ = [(“seconds”, […]

在2D矩阵中找出相同的彩色块

我试图从2D矩阵的左上角开始找出一个相同颜色区域的块。 例如:我有以下矩阵: 1 1 1 2 2 3 1 1 2 3 4 5 1 1 1 1 3 4 1 4 3 2 1 5 2 3 4 5 1 2 比如,最初的左上角是1,我想找出包含1的相邻区域(我只考虑从左上角开始)。 在上面的矩阵中,数字1,2,3,4,5代表不同的颜色。 我尝试使用以下代码段来查找相同的颜色块: colors = [“red”, “green”, “blue”, “purple”, “orange”] # create an array of the colors so we can do work on […]

如何使用Python写入硬件中的寄存器?

我有一个C函数,通过打开设备描述符(nf10)可以完美地读/写硬件寄存器。 我正在尝试使用Python做同样的事情。 我能够读取寄存器,但我无法写入寄存器。 为什么我不能写? 有没有更好的方法来对硬件中的寄存器进行读/写操作? 相关的Python代码: #! /usr/bin/env python import os from fcntl import * from struct import * SIOCDEVPRIVATE = 35312 NF10_IOCTL_CMD_READ_STAT = SIOCDEVPRIVATE + 0 NF10_IOCTL_CMD_WRITE_REG = SIOCDEVPRIVATE + 1 NF10_IOCTL_CMD_READ_REG = SIOCDEVPRIVATE + 2 def rdaxi(addr): f = open(“/dev/nf10”, “r+”) arg = pack(“q”, int(addr, 16)) value = ioctl(f, NF10_IOCTL_CMD_READ_REG, arg) value = […]

将带有hex值的符号常量添加到Python扩展模块

我在头文件中定义了一些值作为符号常量: #define NONE 0x00 #define SYM 0x11 #define SEG 0x43 … 这些值的名称代表某种类型的数据。 现在,在我目前的模块实现中,我将所有这些符号链接放入一个数组中 static unsigned char TYPES[] = { NONE, SYM, SEG, …} 并将数组中类型的位置添加为模块中的int常量。 PyMODINIT_FUNC initShell(void) { PyObject *m; m= Py_InitModule3(“Sample”, sample_Methods,”Sample Modules”); if (m == NULL) return; … PyModule_AddIntConstant(m, “NONE”, 0); PyModule_AddIntConstant(m, “SYM”, 1); PyModule_AddIntConstant(m, “SEG”, 2); … } 在调用函数时,我必须执行以下操作: static PyObject *py_samplefunction(PyObject *self, […]

Python ctypes:用运算符包装c ++类

我想用ctypes包装一个小的测试C ++类,用于python。 该类称为Edge并具有朋友比较(==)运算符。 我在包装python代码中实现比较function有困难。 简洁的Edge标题是: class Edge { private: int p1, p2; public: Edge(const int pp1, const int pp2); ~Edge(){}; friend bool operator==(const Edge &e1, const Edge &e2); }; 我写的python包装器是: from ctypes import * lib = cdll.LoadLibrary(‘./libedge.so’) lib.Edge_new.argtypes = [c_int, c_int] lib.Edge_new.restype = c_void_p lib.compare_edge.argtypes = [c_void_p, c_void_p] lib.compare_edge.restype = c_bool class Edge(object): def __init__(self, […]

C或Python中的双峰分布

根据C或Python中的双峰分布生成随机值的最简单方法是什么? 我可以实现类似Ziggurat算法或Box-Muller变换的东西,但如果有一个现成的库,或者一个我不知道的简单算法,那就更好了。

Python ctypes无法从.so文件返回长字符串值

我正在学习C并试图通过使用python包ctypes将.so导入到我的python文件中以获得更高的性能。 所以一切顺利,直到我在尝试从.so文件返回一个字符串时遇到困难。 C代码: char *convert_to_16(char *characters, int n){ char sub_buffer[3]; char code[3]; char *buffer = (char*)malloc(sizeof(characters) * 2); for(int i=0; i < n; i++){ strncpy(code, characters+i, 1); sprintf(sub_buffer, "%x", *code); strncat(buffer, sub_buffer, 2); } return buffer; } // main() only for test int main(){ char param[] = "ABCDEFGHTUIKLL"; printf("%s\n", param); int length = strlen(param); printf("%s\n", […]

python – 如何将装饰器应用于用C编写的Python函数?

喜欢微博回答,但会接受CPython 我在C中实现了一个Python函数。 你如何将装饰器应用于用C编写的Python函数?