Tag: python

在Windows7 Py_InitModule4上使用mingw_x64编译的python_x64 + C库

我正在尝试使用mingw-x64在Windows7(64位)上为python编译C库。 这一切都像32位版本的魅力。 我以前使用gcc -shared -IC编译我的库:\ Python27 \ include -LC:\ Python27 \ libs myModule.c -lpython27 -o myModule.pyd 它适用于32位版本。 相同的过程适用于64位Linux。 但是在64位windows7上(使用64位x86_64-w64-mingw32和64位python 2.7.5)我遇到了一个问题: C:\Users\sergej\AppData\Local\Temp\cci8TbXw.o:myModule.c:(.text+0x267): undefined reference to `__imp_Py_InitModule4′ collect2: ld returned 1 exit status 我检查了C:/Python27/libs/modsupport.h,它已经包含了 #if SIZEOF_SIZE_T != SIZEOF_INT /* On a 64-bit system, rename the Py_InitModule4 so that 2.4 modules cannot get loaded into a 2.5 interpreter […]

如何计算不同基数中的数字位数?

我正在使用不同基础的数字(基数为10,基数为8,基数为16等)。 我正在尝试计算每个数字中的字符数。 例 编号: ABCDEF 位数: 6 我知道基于对数的方法,但我遇到了一些问题。 这个Python脚本输出它无法正确计算1,000,000个3,969个数字中的正确位数。 我认为使用对数的方法可能相当慢 链接: 这个C程序必须非常慢(如果我有一个非常大的数字怎么办?)。 它也不能处理不同基数的数字(例如,base-16)。 这不是一个骗局,因为OP只询问基数为10 编辑:当然我可以计算一个字符串的长度,但最让我感兴趣的是,是否可以在没有常规字符串的情况下进行计算。 我想知道的算法可以帮助我知道只需要知道源基和转换的基数 。 Edit2: source-base是base-10 , 转换为的base可以是任何其他base。 我们如何计算不同基数中的数字位数? 如果我知道base-10中的数字,如何在不执行转换的情况下计算转换为base-16(base-8等)的相同数字的位数? 注意 :一些Python或C代码将不胜感激

C ++ OpenCV 2.3中缺少MoveWindow()

我正在使用OpenCV 2.3的C ++版本,我正在努力完成一项基本任务。 我想要做的是创建一个窗口并将其移动到屏幕上的特定位置,例如: cv::namedWindow(“My Window”, 1); cv::MoveWindow(“My Window”, 10, 10); 但是,似乎MoveWindow()函数不可用。 从OpenCV 2.3文档( 链接 )看来,似乎有C和Python实现,但没有C ++。 这是否意味着有更好的方法可以做到这一点? 从文档的相关部分: MoveWindow ========== Moves window to the specified position ————————————– C: void cvMoveWindow(const char* name, int x, int y) Python: cv.MoveWindow(name, x, y) → None Parameters: – name – Window name – x – The new x-coordinate […]

从C线程调用Python代码

当从C(或C ++)线程调用Python代码时,我对如何确保线程安全性感到非常困惑。 Python文档似乎在说,通常这样做的习惯是: PyGILState_STATE gstate; gstate = PyGILState_Ensure(); /* Perform Python actions here. */ result = CallSomeFunction(); /* evaluate result or handle exception */ /* Release the thread. No Python API allowed beyond this point. */ PyGILState_Release(gstate); 事实上,这个stackoverflow答案似乎也证实了这一点。 但是一位评论者(声誉很高)却说不然。 评论者说你应该使用PyEval_RestoreThread() / PyEval_SaveThread() 。 文档似乎证实了这一点: PyThreadState* PyEval_SaveThread() Release the global interpreter lock (if it has been […]

如何构造unpack c null终止字符串?

我使用tcp将数据发送到python服务器。 数据如下: struct protocol { unsigned char prot; int id; char name[32]; } 查看name字段,它是一个以空字符结尾的字符串,最大大小为32.现在我使用strcpy 。 protocol p; memset(&p, 0, sizeof(p)); strcpy(name, “abc”); 现在我用python解压缩它。 prot,id,name = struct.unpack(“@Bi32s”) 现在len(name)是32.但是当长度为3时我需要获得字符串”abc” 。 我怎样才能做到这一点?

是否有一个明智的技巧来检查数字的可分性为2或3?

我正在寻找相当于(num%2) == 0 || (num%3) == 0逐位测试 (num%2) == 0 || (num%3) == 0 。 我可以用num&1替换num%2 ,但我仍然坚持使用num%3和逻辑 – 或者。 这个表达式也等同于(num%2)*(num%3) == 0 ,但我不确定这有多大帮助。

将FILE *传递给Python / ctypes中的函数

我有一个库函数(用C编写),它通过将输出写入FILE *来生成文本。 我想在Python(2.7.x)中使用创建临时文件或管道的代码将其包装,将其传递给函数,从文件中读取结果,并将其作为Python字符串返回。 这是一个简单的例子来说明我的目标: /* Library function */ void write_numbers(FILE * f, int arg1, int arg2) { fprintf(f, “%d %d\n”, arg1, arg2); } Python包装器: from ctypes import * mylib = CDLL(‘mylib.so’) def write_numbers( a, b ): rd, wr = os.pipe() write_fp = MAGIC_HERE(wr) mylib.write_numbers(write_fp, a, b) os.close(wr) read_file = os.fdopen(rd) res = read_file.read() read_file.close() return […]

正确的方法将numpy.matrix转换为C双指针

将numpy矩阵作为参数传递给C函数采用双指针的规范方法是什么? 上下文 :我使用numpyvalidation一些C代码 – 我有一个C函数,它接受const double ** const ,我使用ctypes从Python调用.so 。 我试过了: func.argtypes = ctypeslib.ndpointer(dtype=double, ndim=2, flags=”C_CONTIGUOUS”) 直接传递numpy矩阵(不起作用),以及 func.argtypes = ctypes.POINTER(ctypes.POINTER(ctypes.c_double)) 然后通过各种演员numpy传递numpy矩阵。 Casting导致了Python错误 TypeError: _type_ must have storage info 注意 :这个问题在几年前出现在这里 ,但没有完全成功的解决方案。

使用ctypes传递数组

我有一个C函数 void read_FIFO_AI0(int16_t** input, size_t size, NiFpga_Session* session, NiFpga_Status* status) { *input = (int16_t*) malloc (size*sizeof(int16_t)); // function that populates the array *input } 填充数组“* input”。 现在我想将该数组中的数据传递给python进行进一步处理。 我尝试使用ctypes来做到这一点: def read_FIFO_AI0(size,session,status): _libfpga.read_FIFO_AI0.argtypes = [POINTER(ARRAY(c_int16, size)), c_int, POINTER(c_uint32), POINTER(c_int32)] _libfpga.read_FIFO_AI0.restype = None values = (c_int16*size)() _libfpga.read_FIFO_AI0(byref(values),size,byref(session),byref(status)) return values 代码执行但我在数组中得到错误的结果。 当我尝试在CI中使用C函数时获得正确的结果: size_t size=20; int16_t* input; read_FIFO_AI0(&input, size, &session, […]

如何在Python中重定向stderr? 通过Python C API?

这是我最近两个问题的组合: [1] C中的Python实例方法 [2] 如何在Python中重定向stderr? 我想从python脚本中记录stdout和stderr的输出。 我想问的是,根据[1]创建一个新类型似乎相当复杂。 如果不需要将新类型暴露给Python,它是否简化了事情,即它只存在于C中? 我的意思是,当Python打印出来的东西时,它会转到“Objects / fileobject.c”,然后在“PyFile_WriteObject”中检查它是否可以写入其参数: writer = PyObject_GetAttrString(f, “write”); if (writer == NULL) … 此外,有可能像这样得到stdout和stderr: PyObject* out = PySys_GetObject(“stdout”); PyObject* err = PySys_GetObject(“stderr”); 我的问题是,是否有可能构造必要的PyObject,它满足上面的’PyObject_GetAttrString(f,“write”)’并且可以调用,所以我可以写: PySys_SetObject(“stdout”, ); http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject 这样,就没有必要将新的“writer类型”暴露给Python脚本的其余部分,所以我认为编写代码可能会有点简单……?