如何连接Python和C程序?

我有一个基于python的程序,从连接到rs232电缆的端口读取串行数据。 我想把我在这里得到的数据传递给一个C程序,它将处理计算密集型的一面。 我一直在检查网络,我发现的都是基于Linux的。

使用管道和popen

解决这个问题最简单的方法就是使用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,我想也可以使用它。

我的建议是instant模块的inline函数,但只有在你可以在单个c函数中完成所需的一切时才有效。 你只需传递它的ac函数,它就会在运行时编译ac扩展。

  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) 

有很多方法可以做到这一点。

  1. 最简单的方法是使用Python C API并为C库编写一个可以从Python调用的包装器。 这将您的模块与CPython联系起来。

  2. 第二种方法是使用ctypes ,它是Python的FFI ,允许您直接加载和调用C库中的函数。 从理论上讲,这应该适用于Python实现。

  3. 第三种方法是使用Pyrex或它的下一代版本Cython ,它允许您使用编译器可以转换为编译代码的类型信息来注释您的Python代码。 它也可以用来编写包装器。 AFAIK,它与CPython有关。

  4. 另一种方法是使用SWIG ,它是一种生成粘合代码的工具,可帮助您包装C库以供Python使用。 它基本上是第一种使用辅助工具的方法。

  5. 另一种方法是使用Boost Python API ,它是一个面向对象的原始Python C API包装器。

以上所有内容都可以让您在同一过程中完成工作。

如果这不是一个约束,就像Digital Ross建议的那样,你可以简单地生成一个子进程并移交参数(作为命令行或通过它的标准输入)并让外部进程为你工作。

这条RS-232电缆每秒钟有多少位? 您是否测试过结果,表明Python不会足够快地执行嘎吱嘎嘎的位? 如果还没有编写C程序,可以考虑在Python中编写计算密集型方面的可能性,如果Python不够快,可以轻松回退到Cython 。

实际上,这个问题与C ++没什么关系。 话虽如此,您可以尝试SWIG – 它是多平台的,允许从Python到C / C ++的函数调用。

我会像sockets一样使用标准forms的IPC。

一个好的开始是Beej的指南。

另外,如果您专门使用c,请不要使用c ++标记问题。 c和c ++是不同的语言。

我使用ctypes: http : //python.net/crew/theller/ctypes/tutorial.html
它允许您从python中调用c(和c ++)代码。