Tag: python

Python运行时:重新编译和重用C库

我正在开发一种用于对用户定义函数进行数值分析的工具。 我们的想法是在Python中创建一个方便的UI,用户可以在其中输入C函数,然后按下按钮 – 并接收一些输出数据。 计算可能需要几分钟或几小时,因此不能接受仅限Numpy的性能。 我尝试了以下方法:基于Python的UI调用gcc,从用户函数编译dll,这是我在Cython包装中使用的基于C的核心算法所使用的。 它工作,但由于没有办法完全卸载python模块,我不能重新编译用户定义的函数,直到整个UI程序关闭并再次运行。 我现在看到的唯一方法是分离计算核心和UI进程,然后通过共享内存/消息传递使它们进行交互。 当用户想要更新他的function时,程序终止核心,重新编译DLL并再次启动核心。 在这种情况下你能建议任何常见做法吗? 谢谢!

如何将数组从c ++传递给python函数并将python返回的数组检索到c ++

我正在写一个c ++程序来调用python函数并检索返回数组。但我总是得到如下错误: 只有length-1数组才能转换为Python标量 和我的c ++代码: int main(int argc, char *argv[]) { int i; PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue; if (argc 3 ) { pArgs = PyTuple_New(argc – 3); for (i = 0; i < argc – 3; i++) { pValue = PyInt_FromLong(atoi(argv[i + 3])); if (!pValue) { PyErr_Print(); return 1; } PyTuple_SetItem(pArgs, i, […]

当输入是奇数个BITS(不是字节)时,生成CRC8 / 16的最佳方法是什么? C或Python

所以我坚持使用在奇数位上添加CRC8 / CRC16的协议。 (即,它不能被8整除)在软件中为它生成CRC的最佳方法是什么? 有很多CRC算法使用表,但它们是每字节查找。 当然,一次只做一次“故障安全”。 但是有更好的方法吗? 也许主要通过表查找来完成它,然后一次完成它? 我目前在python中使用bitarray来处理这个问题。 但是C中的解决方案也可以。 谢谢! 编辑:请注意,我正在与现有硬件接口,这些硬件在奇数位上计算CRC。 (这对于HW来说很容易,因为它们一次只使用LFSR – 1位!)因此,虽然使用已知模式的填充可以用于完整性检查,但它会破坏hw兼容性。

使这个C数组处理代码更加python(甚至numpy)

我试图了解python的惊人列表处理能力(最终是numpy)。 我正在转换我编写的一些C代码到python。 我有一个文本数据文件,其中第一行是标题,然后每个奇数行是我的输入数据,每个偶数行是我的输出数据。 所有数据空间分开。 我很高兴能够使用嵌套列表推导将所有数据读入列表。 太棒了。 with open(‘data.txt’, ‘r’) as f: # get all lines as a list of strings lines = list(f) # convert header row to list of ints and get info header = map(int, lines[0].split(‘ ‘)) num_samples = header[0] input_dim = header[1] output_dim = header[2] del header # bad ass list comprehensions […]

将C结构传递给Python函数

我需要一种简单的方法将C结构传递给Python函数。 我已经将Python嵌入到游戏服务器中,我打算用Python编写游戏逻辑。 我搜索了谷歌和邮件列表,没有发现任何有用的东西。 我在C中有一个复杂的结构(指向其他相对复杂的结构)并且没有找到合理的方法。 我有这个结构: struct client { int state; int sockfd; struct sockaddr_in *addr; struct epoll_event *epollev; struct buffer *in_buffer; struct buffer *out_buffer; struct packet *packet; struct player *player; }; 并且需要将它传递给Python函数,在那里我可以使用通用语法轻松访问成员(最好不要使用像dicts这样的东西,尽管那也没关系)。 这几乎就像我需要一个PyObject_FromStruct函数。 有没有相对简单的方法来做到这一点?

在C和python中实现sendall()和recvall()

我目前正在尝试在用C编写的服务器中实现sendall()函数,并在用python编写的相应客户端上实现recvall()函数。 我可以让服务器和客户端一起工作,因为它们都是用同一种语言编写的(即在c或两者都是在python中),但是我不能让它与c中的服务器和客户端一起工作python。 目前,我想从c服务器向python客户端发送一个简单的字符串。 C中的服务器sendall()实现如下(从Beej的指南中引用): int sendall(int socket, char * buf, int *len){ int total = 0; // how many bytes we’ve sent int bytesleft = *len; // how many we have left to send int n; while(total < *len) { n = send(socket, buf + total, bytesleft, 0); if (n == -1) { break; } […]

Cython致命错误:Python.h没有这样的文件或目录

我一直在使用Cython将我的Python文件编译成C文件,然后使用MinGW从C文件创建可执行文件。 Cython工作正常,我可以在命令行输入cython test.pyx并获取一个C文件。 问题是当我尝试从C文件编译可执行文件时。 如果我输入gcc test.c我会收到以下错误: test.c:4:20: fatal error: Python.h: No such file or directory #include “Python.h” ^ compilation terminated. 我真的很感激一些帮助。 我正在运行Windows 7和python 3.5。

使用Python C API调用C函数两次时的分段错误

最近我想使用C包装器从Fortran调用Python(见这里 )。 下面我发布一个更简单的例子。 函数的第二次调用导致pModule = PyImport_Import(pName)处的分段错误。 我发现问题是from scipy.optimize import newton线 – 如果我评论它一切正常。 任何想法如何解决它? rootC.c #include “rootC.h” #include void root_(double* A, double* B, double* t, double* x) { PyObject *pName, *pModule, *pFunc; PyObject *pArgs, *pValue, *sys, *path; Py_Initialize(); sys = PyImport_ImportModule(“sys”); path = PyObject_GetAttrString(sys, “path”); PyList_Append(path, PyString_FromString(“.”)); pName = PyString_FromString(“rootPY”); pModule = PyImport_Import(pName); if (!pModule) { […]

如何在C和Python之间处理IPC?

我有一个带有两个进程的应用程序,一个在C中,一个在Python中。 C进程是完成所有繁重工作的地方,而Python进程则处理用户界面。 C程序每秒写入4次大型缓冲区,Python进程读取此数据。 到目前为止,AMQP已经完成了与Python进程的通信。 我更愿意在两个进程之间设置一些内存共享,以减少开销并提高性能。 我有什么选择? 理想情况下,我只是简单地让Python进程直接读取物理内存(最好是从内存中读取而不是从磁盘中读取),然后使用信号量或类似的东西来处理竞争条件。 然而,这是我没什么经验的东西,所以我很感激我能得到的任何帮助。 我正在使用Linux btw。

SWIG – 将C字符串数组包装到python列表

我想知道使用SWIG将C中的字符串数组包装到Python列表的正确方法是什么。 数组在struct中: typedef struct { char** my_array; char* some_string; }Foo; SWIG自动将some_string包装到python字符串。 我应该把什么放在SWIG接口文件中,以便我可以在Python中访问my_array作为常规Python字符串列表[‘string1’,’string2’]? 我使用了typemap作为sugested: %typemap(python,out) char** { int len,i; len = 0; while ($1[len]) len++; $result = PyList_New(len); for (i = 0; i < len; i++) { PyList_SetItem($result,i,PyString_FromString($1[i])); } } 但那仍然行不通。 在Python中,my_array变量显示为SwigPyObject:_20afba0100000000_p_p_char。 我想知道是不是因为char **在一个结构中? 也许我需要告知SWIG那个? 有任何想法吗?