如何实现 C/C++ 与 Python 的通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现 C/C++ 与 Python 的通信相关的知识,希望对你有一定的参考价值。

简单的办法是通过文件,两个程序各做各的,通过文件来通讯。这个相当推荐。特别是新手,绝对好用。

或者是通过管道(在某些操作系统下不稳定)。

复杂一些的,分布式通用对象接口。这个基本上被大家放弃了。然后是XML+webservice,这个方案因为复杂度高,慢慢也不用了。目前流行的方式是restful + json。 protocolbuf还有thrift方法,这里也不详述,有一整套的方法。

还有更直接的方法,共享内存与嵌入。或者是python嵌入C++或者是反过来。在python里调 用C++。有专门的接口,参考python的帮助。

有一个直接又轻松的办法,使用cython,直接写C++模块,然后用python调用。传递参数也有很多种方法。这里不一一描述。

另外在c++里嵌入python还有一些偏门的方法。比如有人封装过VCL组件,直接通过组件就可以调 用。
参考技术A 管道、socket、文件、...

C如何实现大数的Python赋值

【中文标题】C如何实现大数的Python赋值【英文标题】:How does C implements the Python assignment of large numbers 【发布时间】:2013-10-23 06:33:37 【问题描述】:

Python 是用 C 编写的,实际上是一个 C 程序,这让我想知道如何处理十进制数字赋值。

C 程序如何实现非常大的十进制数(大于 int 或 long)的 Python 变量赋值?

例如:

a=10000...  # a=(10^1000)

在 python 中运行时,我知道该值太大以至于它需要在内存中占用很多单词,所以 C 程序显然是这样做的,但是如何呢?

C 中的每个变量都有一个类型,但是 C 编译的代码不知道这个数字会有多大。

(python)C 程序如何处理该分配? (以及对这些变量的操作)

【问题讨论】:

是什么让您认为 Python 运行时会将值分配给 C 变量? 有趣的问题,但我不确定是不是这样,请参阅 Daenyth post 和 Duncan post 请在您的问题标题上更具体地说明大十进制数字 另一个帖子没有提到超过long和int的非常大的数字,这和我问的不一样。 @user2162550:Python long 不是 C long,它涉及非常大的数字。 OTOH,这个问题与它背后的 C 实现无关,所以我同意它不是重复的。 【参考方案1】:

这是 CPython 2.7.5 中用于表示长整数的 C struct

/* Long integer representation.
   The absolute value of a number is equal to
        SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
   Negative numbers are represented with ob_size < 0;
   zero is represented by ob_size == 0.
   In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
   digit) is never zero.  Also, in all cases, for all valid i,
        0 <= ob_digit[i] <= MASK.
   The allocation function takes care of allocating extra memory
   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.

   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
   aware that longs abuse  ob_size's sign bit.
*/

struct _longobject 
        PyObject_VAR_HEAD
        digit ob_digit[1];
;

如果您想进一步探索,download the source code 并查看以下文件:

./Include/longintrepr.h
./Include/longobject.h
./Objects/longobject.c

这将告诉您您可能想知道的每一个细节。 :)

【讨论】:

【参考方案2】:

出于性能原因,Python 可能有自己的大量实现,但它可以使用任何第三方任意精度库,例如 GMP。

【讨论】:

以上是关于如何实现 C/C++ 与 Python 的通信的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 C/C++ 与 Python 的通信

C/S结构的程序如何实现客户端与服务端的通信

LINUX下,如何使用C/C++对EXCEL进行读写!

用C/C++实现字符串的创建,并进行查找与替换

如何使用 Linux 的虚拟串口使 C 程序与 Python 程序通信?

c/c++/c++11 浅拷贝和深拷贝