c和python混合编程
『壹』 如何实现C与python混合编程
实现C与python混合编程方法
代码如下:
/* tcpportping.c */
#include <Python.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
/* count time functions */
static double mytime(void)
{
struct timeval tv;
if (gettimeofday(&tv, NULL) == -1)
return 0.0;
return (double)tv.tv_usec + (double)tv.tv_sec * 1000000;
}
static PyObject * /* returns object */
tcpping(PyObject *self, PyObject *args )
{
struct sockaddr_in addr;
struct hostent *hp;
double time;
char *host = NULL;
int fd;
int port, timeout;
if (!PyArg_ParseTuple(args, "sii", &host, &port, &timeout)) /* convert Python -> C */
return NULL; /* null=raise exception */
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return Py_BuildValue("d", -1.0); /* convert C -> Python */
}
bzero((char *)&addr, sizeof(addr));
if ((hp = gethostbyname(host)) == NULL) {
return Py_BuildValue("d", -2.0); /* convert C -> Python */
}
b(hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
double stime = mytime();
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
return Py_BuildValue("d", -3.0); /* convert C -> Python */
}
fd_set read, write;
FD_ZERO(&read);
FD_ZERO(&write);
FD_SET(fd, &read);
FD_SET(fd, &write);
if (select(fd + 1, &read, &write, NULL, &tv) == 0) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}
double etime = mytime();
time = etime - stime;
if (!FD_ISSET(fd, &read) && !FD_ISSET(fd, &write)) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}
close(fd);
return Py_BuildValue("d", time/1000); /* convert C -> Python */
}
/* registration table */
static struct PyMethodDef portping_methods[] = {
{"tcpping", tcpping, METH_VARARGS}, /* method name, C func ptr, always-tuple */
{NULL, NULL} /* end of table marker */
};
/* mole initializer */
void inittcpportping( ) /* called on first import */
{ /* name matters if loaded dynamically */
(void) Py_InitMole("tcpportping", portping_methods); /* mod name, table ptr */
}
『贰』 如何实现 C/C++ 与 Python 的通信
属于混合编程的问题。较全面的介绍一下,不仅限于题主提出的问题。
以下讨论中,Python指它的标准回实现,即CPython(虽然答不是很严格)
本文分4个部分
C/C++ 调用 Python (基础篇)— 仅讨论Python官方提供的实现方式
Python 调用 C/C++ (基础篇)— 仅讨论Python官方提供的实现方式
C/C++ 调用 Python (高级篇)— 使用 Cython
Python 调用 C/C++ (高级篇)— 使用 SWIG
练习本文中的例子,需要搭建Python扩展开发环境。具体细节见搭建Python扩展开发环境 - 蛇之魅惑 - 知乎专栏
1 C/C++ 调用 Python(基础篇)
Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。
『叁』 python与c++混合编程如何入门
派桑和c/c++实际上是不同的工具,一个是斧头,一个是菜刀,各有各的用途。非要把让菜刀能砍柴,让斧头能切菜,这种努力有无必要,值得考虑。
派桑常用剧本,噜苏,速度慢,不严谨,但有它的便利,例如它有 list, tuple, 之类的东西。
混合编程 常用于 提高 派桑 速度。
常用 方法 是(1)包含 Python.h 文件头 (2)定义 派桑 的 各种对象 为 各种 c 结构
(3)派桑 的 各种对象用指针,名字用 Py 或 _Py大头 动态分配 在 heap (4)用函数跟踪统计 各种对象结构 的个数变化,即时 释放内存(5)及时处理 派桑 exception
(6) 输出为派桑的数据格式。
我没有合起来用过,不过基本套路如此。
『肆』 如何发布C和python混合编程的程序
派桑和c/c++实际上是不同的工具,一个是斧头,一个是菜刀,各有各的用途。非要把让菜刀能砍柴,内让斧头能容切菜,这种努力有无必要,值得考虑。
派桑常用剧本,噜苏,速度慢,不严谨,但有它的便利,例如它有 list, tuple, 之类的东西。
混合编程 常用于 提高 派桑 速度。
常用 方法 是(1)包含 Python.h 文件头 (2)定义 派桑 的 各种对象 为 各种 c 结构
(3)派桑 的 各种对象用指针,名字用 Py 或 _Py大头 动态分配 在 heap (4)用函数跟踪统计 各种对象结构 的个数变化,即时 释放内存(5)及时处理 派桑 exception
(6) 输出为派桑的数据格式。
我没有合起来用过,不过基本套路如此。
『伍』 python和c语言混编的几种方式
C语言设计一个完整的可执行文件,然后python通过subprocess来执行该可执行文件,本质上是fork+execve。
C语言使用popen/system或者直接以系统调用级fork+exec来运行python程序也是一种混编的手段了。
『陆』 python和c++混编cmake怎么写
please reload systemd manually or reboot the system 提示信息里不是说让你重新加载systemd吗? 如果手工加载不上,重启也不行回,请确认一下,是否安装了答systemd.
『柒』 python怎么和C或者C++混合编程
不难的,就是一个套路,主要是3步:
1.把Python的数据类型转换为C/C++支持的数据类型;
2.调用C/C++函数,得到结果;
3.将结果转换为Python支持的数据类型,返回。
相当于写个中间层。
『捌』 Python和c语言有什么区别
前者为 脚本语言 需要虚拟机 解释执行 ..一般情况下 不能生成exe(要使用打包工具)
后者为 为编译型语言 ..可以直接转换为 二进制 代码 ...执行速度 也相对较快 ..
两者可以混合编程
『玖』 python和什么语言混编
python是C语言编写的一门
高级语言
,支持和原生C语言
混编
,甚至可以直接添加C代码执行。