Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何连接Python和C程序?_Python_C - Fatal编程技术网

如何连接Python和C程序?

如何连接Python和C程序?,python,c,Python,C,我有一个基于python的程序,可以从连接到rs232电缆的端口读取串行数据。我想把我在这里得到的数据传递给一个C程序,它将处理计算密集型方面的事情。我一直在检查网络,发现所有的都是基于linux的。我会使用标准形式的IPC,比如套接字 一个好的开始是 也不要用C++来标记问题,如果你是特别使用C。C和C++是不同的语言。< /P>使用管道和POPN 处理这个问题最简单的方法可能就是使用popen(3)。popen函数在Python和C中都可用,它将使用管道将任一种语言的程序与另一种语言的程序连

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

我会使用标准形式的IPC,比如套接字

一个好的开始是

<>也不要用C++来标记问题,如果你是特别使用C。C和C++是不同的语言。< /P>使用管道和POPN 处理这个问题最简单的方法可能就是使用
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
有很多方法可以做到这一点

  • 最原始、最简单的方法是使用,并为您的C库编写一个可从Python调用的包装器。这会将您的模块连接到CPython

  • 第二种方法是使用它,它是Python的一种工具,允许您直接加载和调用C库中的函数。理论上,这应该可以跨Python实现工作

  • 第三种方法是使用or的下一代版本,它允许您使用类型信息对Python代码进行注释,编译器可以将其转换为编译代码。它也可以用来编写包装器。好了,它和CPython有关

  • 还有一种方法是使用它,它是一种生成粘合代码的工具,可以帮助您包装C库,以便从Python中使用。这基本上是第一种使用辅助工具的方法

  • 另一种方法是使用它,它是原始Python C API上的面向对象包装器

  • 所有这些都可以让您在相同的过程中完成工作


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

    这根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实现联系在一起)。