我有一个基于python的程序,从连接到rs232电缆的端口读取串行数据.我想把我在这里得到的数据传递给一个C程序,它将处理计算密集型的一面.我一直在检查网络,我发现的都是基于Linux的.
我的建议是模块中的inline
功能instant
,但只有在单个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)
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点.
最简单的方法是使用Python C API并为C库编写一个可以从Python调用的包装器.这将您的模块与CPython联系起来.
第二种方法是使用ctypes,它是Python 的FFI,允许您直接加载和调用C库中的函数.从理论上讲,这应该适用于Python实现.
第三种方法是使用Pyrex或它的下一代版本Cython,它允许您使用编译器可以转换为编译代码的类型信息来注释您的Python代码.它也可以用来编写包装器.AFAIK,它与CPython有关.
另一种方法是使用SWIG,它是一种生成粘合代码的工具,可帮助您包装C库以供Python使用.它基本上是第一种使用辅助工具的方法.
另一种方法是使用Boost Python API,它是一个面向对象的原始Python C API包装器.
以上所有内容都可以让您在同一个过程中完成工作.
如果这不是一个约束,就像Digital Ross建议的那样,你可以简单地生成一个子进程并移交参数(作为命令行或通过它的标准输入)并让外部进程为你工作.
处理这个问题最简单的方法可能就是使用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)
Run Code Online (Sandbox Code Playgroud)
一旦你有了管道,你可能应该通过它发送 yaml 或 json,尽管我从未尝试过在 C 中读取任何一个。如果它确实是一个简单的流,只需自己解析它。如果您喜欢 XML,我想也可以使用它。