Tag: python

Python将32位指针地址传递给C函数

我想在Python脚本的共享库中调用我的C函数。 传递指针时出现问题,64位地址似乎被截断为被调用函数内的32位地址。 Python和我的库都是64位。 下面的示例代码演示了该问题。 Python脚本打印传递给C函数的数据的地址。 然后,从被调用的C函数内打印接收的地址。 此外,C函数通过打印本地创建内存的大小和地址来certificate它是64位。 如果以任何其他方式使用指针,则结果是段错误。 的CMakeLists.txt cmake_minimum_required (VERSION 2.6) add_library(plate MODULE plate.c) plate.c #include #include void plate(float *in, float *out, int cnt) { void *ptr = malloc(1024); fprintf(stderr, “passed address: %p\n”, in); fprintf(stderr, “local pointer size: %lu\n local pointer address: %p\n”, sizeof(void *), ptr); free(ptr); } test_plate.py import numpy import scipy import […]

如何分析组合的python和c代码

我有一个由多个python脚本组成的应用程序。 其中一些脚本正在调用C代码。 应用程序现在运行速度比以前慢得多,所以我想对其进行分析以查看问题所在。 是否有工具,软件包或只是一种方式来分析这样的应用程序? 一个工具,它将遵循python代码到C代码并配置这些调用? 注1:我很清楚标准的Python分析工具。 我特意在这里寻找组合的Python / C分析。 注2:Python模块使用ctypes调用C代码(有关详细信息,请参阅http://docs.python.org/library/ctypes.html )。 谢谢!

Swig,返回一系列双打

我知道,通常有很多方法可以解决某些问题。 但在这里,我知道我希望它采用哪种方式,但我无法使其与Python和SWIG一起使用… 我有一个C函数,它返回一个double值数组: double *my(int x) { double a,b,*buf; buf = malloc (x * sizeof(double)); a=3.14; b=2.7; buf[0]=a; buf[1]=b; return buf; } 在这里,我明确地希望将数组作为返回值。 不像在许多示例中那样写入输入数组的’void’函数。 现在,我想获得一个SWIG-python包装器,它可以用作: >>> import example >>> print example.my(7) [3.14,2.7] 无论我做什么,我都有一些概念上的问题 – 我总是得到s.th. 喜欢 我试图在swg文件中定义一些类型图: %typemap(out) double [ANY] { int i; $result = PyList_New($1_dim0); for (i = 0; i < $1_dim0; i++) { […]

如何膨胀部分zlib文件

我有一个用zlib的deflate()函数压缩的文件的第一个连续的2 / 3rds。 最后1/3在传输中丢失了。 原始未压缩文件为600KB。 发送器多次调用Deflate,同时将原始文件切割为2KB的块大小,并在传递Z_FINISH时将Z_NO_FLUSH传递给文件末尾。 生成的完整压缩文件已传输,但如所述部分丢失。 是否有可能恢复原始文件的一部分? 如果是的话,有什么建议吗? 我正在使用ZLIB的普通C实现和/或ZLIB的Python 2.7实现。

python在哪里查找由ctypes.cdll打开的dll。在Windows上的?

我是无法在互联网上找不到一个简单的答案,所以也许将来有一个因为这个问题! 我正在使用pywiiuse,一个用于Windows上的C wiiuse库的python包装器。 通过在源代码目录中包含dll,header和library,我得到了几个简单的C示例。 但是,我想知道在哪里放dll以便pywiiuse会找到它。 查看源代码显示它按如下方式加载: dll = ctypes.cdll.wiiuse 当我在与测试示例相同的目录中使用dll时,运行示例会产生模块未找到exception。 python在哪里寻找DLL?

Python:GIL上下文 – 切换

所以,我通常非常了解Python中的全局解释器锁 (GIL)是如何工作的。 本质上,当解释器运行时,一个线程保持GIL为N刻度(其中N可以使用sys.setcheckinterval设置),此时GIL被释放而另一个线程可以获取GIL。 如果一个线程开始I / O操作,也会发生这种情况。 我有点困惑的是这一切是如何与C扩展模块一起工作的。 如果你有一个C扩展模块获取GIL,然后使用PyEval_EvalCode执行一些python代码,解释器PyEval_EvalCode可以释放GIL并将其提供给其他线程? 或者,获取GIL的C线程是否会永久保持GIL,直到PyEval_EvalCode返回并且GIL在C中明确释放? PyGILState gstate = PyGILState_Ensure(); …. /* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */ PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); PyGILState_Release(gstate);

Python使用ctypes传递char *数组并填充结果

我正在尝试使用ctypes在python中创建一个char *数组,以传递给库以填充字符串。 我期待4个字符串的长度不超过7个字符。 我的py代码看起来像这样 testlib.py from ctypes import * primesmile = CDLL(“/primesmile/lib.so”) getAllNodeNames = primesmile.getAllNodeNames getAllNodeNames.argtypes = [POINTER(c_char_p)] results = (c_char_p * 4)(addressof(create_string_buffer(7))) err = getAllNodeNames(results) lib.cpp void getAllNodeNames(char **array){ DSL_idArray nodes; //this object returns const char * when iterated over network.GetAllNodeIds(nodes); for(int i = 0; i < (nodes.NumItems()); i++){ strcpy(array[i],nodes[i]); } } 当我尝试运行此代码时,我不断收到分段错误。 我已经从C创建了一个完美的测试但是在Python中我必须正确设置指针数组或其他东西。 […]

将Cython中的numpy数组传递给需要动态分配数组的C函数

我有一些C代码具有以下声明: int myfunc(int m, int n, const double **a, double **b, double *c); 所以a是一个常数的二维数组, b是一个二维数组, c是一维数组,都是动态分配的。 b和c在传递给myfunc之前不需要任何具体的东西,应该被理解为输出信息。 出于这个问题的目的, 我不允许更改myfunc的声明。 问题1:如何将给定的numpy数组a_np转换为具有此C函数所需格式的数组a ,以便我可以在Cython中使用?调用此C函数? 问题2:下面的b和c的声明是否正确,或者它们是否需要采用其他格式才能使C函数将其理解为2D和1D数组(分别)? 我的尝试: myfile.pxd cdef extern from “myfile.h”: int myfunc(int p, int q, const double **a, double **b, double *c) mytest.pyx cimport cython cimport myfile import numpy as np cimport numpy as np p = […]

Linux中的实时RX和TX速率

我正在寻找一种以编程方式(无论是调用库还是独立程序)监视linux中的实时IP流量的方法。 我不想要总计,我想要正在使用的当前带宽。 我正在为OS X的istat菜单的网络流量监视器寻找类似(但非图形化)的工具。 我相当确定这样的东西存在,但我不知道在哪里看,我宁愿不必重新发明轮子。 它是否像监视套接字一样简单? 或者我是否需要一个可以为我处理大量开销的实用程序?

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

是否可以从字符串加载python函数,然后使用参数调用该函数并获取返回值? 我正在使用python C API从我的C ++应用程序中运行python代码。 我可以使用PyImport_Import从文件加载模块,使用PyObject_GetAttrString从中获取一个函数对象,并使用PyObject_GetAttrString调用该函数。 我想做的是从字符串而不是文件加载模块/函数。 是否有一些等同于PyImport_Import ,它允许我传递一个字符串而不是文件? 我需要将参数传递给我正在调用的函数,我需要访问返回值,所以我不能只使用PyRun_SimpleString 。 编辑: 在打开PyRun_String后我找到了这个解决方案。 我正在创建一个新模块,获取它的字典对象,在调用PyRun_String传递它以在我的新模块中定义一个函数,然后为新创建的函数获取一个函数对象,并通过PyObject_CallObject调用它,传递我的args。 这是我发现解决我的问题: main.cpp int main() { PyObject *pName, *pModule, *pArgs, *pValue, *pFunc; PyObject *pGlobal = PyDict_New(); PyObject *pLocal; //Create a new module object PyObject *pNewMod = PyModule_New(“mymod”); Py_Initialize(); PyModule_AddStringConstant(pNewMod, “__file__”, “”); //Get the dictionary object from my module so I can pass […]