如何连接Python和C程序?
我有一个基于python的程序,可以从连接到rs232电缆的端口读取串行数据。我想把我在这里得到的数据传递给一个C程序,它将处理计算密集型方面的事情。我一直在检查网络,发现所有的都是基于linux的。我会使用标准形式的IPC,比如套接字 一个好的开始是 <>也不要用C++来标记问题,如果你是特别使用C。C和C++是不同的语言。< /P>使用管道和POPN 处理这个问题最简单的方法可能就是使用如何连接Python和C程序?,python,c,Python,C,我有一个基于python的程序,可以从连接到rs232电缆的端口读取串行数据。我想把我在这里得到的数据传递给一个C程序,它将处理计算密集型方面的事情。我一直在检查网络,发现所有的都是基于linux的。我会使用标准形式的IPC,比如套接字 一个好的开始是 也不要用C++来标记问题,如果你是特别使用C。C和C++是不同的语言。< /P>使用管道和POPN 处理这个问题最简单的方法可能就是使用popen(3)。popen函数在Python和C中都可用,它将使用管道将任一种语言的程序与另一种语言的程序连
popen(3)
。popen
函数在Python和C中都可用,它将使用管道将任一种语言的程序与另一种语言的程序连接起来
>>> import subprocess
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args)
一旦你有了管道,你可能应该通过它发送yaml或json,尽管我从来没有尝试过用C读这两种语言。如果它真的是一个简单的流,就自己解析它吧。如果你喜欢XML,我想也有可能。 这个问题与C++没有多大关系。 话虽如此,您可以试试——它是多平台的,允许从Python到C/C++的函数调用。我会使用ctypes:
它允许您从python调用c(和c++)代码。我的建议是
即时
模块中的内联
函数,尽管只有当您可以在单个c函数中完成所有需要的操作时,它才起作用。您只需向它传递一个c函数,它就会在运行时编译一个c扩展
from instant import inline
sieve_code = """
PyObject* prime_list(int max) {
PyObject *list = PyList_New(0);
int *numbers, *end, *n;
numbers = (int *) calloc(sizeof(int), max);
end = numbers + max;
numbers[2] = 2;
for (int i = 3; i < max; i += 2) { numbers[i] = i; }
for (int i = 3; i < sqrt(max); i++) {
if (numbers[i] != 0) {
for (int j = i + i; j < max; j += i) { numbers[j] = 0; }
}
}
for (n = numbers; n < end; n++) {
if (*n != 0) { PyList_Append(list, PyInt_FromLong(*n)); }
}
free(numbers);
return list;
}
"""
sieve = inline(sieve_code)
从即时导入内联
筛网_代码=”“
PyObject*素数列表(int max){
PyObject*list=PyList_New(0);
整数*数字,*结束,*n;
numbers=(int*)calloc(sizeof(int),max);
结束=数量+最大值;
数字[2]=2;
对于(inti=3;i
有很多方法可以做到这一点
如果这不是一个约束,就像建议的那样,您可以简单地生成一个子流程并移交参数(作为命令行参数或通过它的标准输入),然后让一个外部流程为您完成这项工作 这根RS-232电缆每秒传输多少位?您有没有测试结果表明Python不能足够快地完成关键部分?如果C程序还没有编写,考虑在Python中编写计算密集型方面的可能性,在Python速度不够快的情况下,很容易回落。对于Windows也是可行的吗?它是有效的,虽然不是完全相同。来自Python手册:在Windows上:Popen类使用CreateProcess()执行子程序,该程序对字符串进行操作。如果args是一个序列,则将使用list2cmdline()方法将其转换为字符串。请注意,并非所有MS Windows应用程序都以相同的方式解释命令行:list2cmdline()是为使用与MS C运行时相同的规则的应用程序而设计的。这可能很明显,但只有发送方使用
popen
,接收过程只执行正常的get*、read、fread等操作。“我发现的都是基于linux的”。。。我猜这意味着你没有使用Linux。你使用的是什么操作系统?是的,它很方便——这里有更多关于它的信息:哪一个操作系统最快?我不完全确定,因为我自己还没有测量过它们,但我会先使用cffi
,如果不够快,直接转到C API(尽管这会将我与单个Python实现联系在一起)。