c调用python

#include <Python.h>//python33(python2.x有几个函数不对应)
/*
PyImport_ImportModule
导入一个Python模块并返回它的指针
PyModule_GetDict
获取一个模块的属性字典对象
PyRun_String
在指定的名字空间内运行代码串
PyObject_SetAttrString
通过namestring为一个对象的属性赋值
PyArg_Parse
将Python返回值对象转换为C语言形式

PyObject_GetAttrString
按名字获取对象的属性值
PyEval_CallObject
调用Python的函数(或类,或方法)
PyArg_Parse
将Python对象转换为C语言值
Py_BuildValue
将C语言值转换为Python对象

PyDict_New
构造一个新的空字典对象
PyDict_SetItemString
给一个字典的键值赋值
PyDict_GetItemString
按键值获取(查询)一个字典值
PyEval_GetBuiltins
得到内置作用域的模块
*/
/*******usermod.py********
message = ‘The meaning of life...‘
def transform(input):
    input = input.replace(‘life‘, ‘Python‘)
    return input.upper()
*/
int main() {
    int *cval, i;
    char *cstr;
    PyObject *pstr, *pmod, *pdict, *pfunc, *pargs, *pval;

    Py_Initialize();

    pmod  = PyImport_ImportModule("usermod");
    pdict = PyModule_GetDict(pmod);
    pstr  = PyRun_String("message", Py_eval_input, pdict, pdict);
    PyArg_Parse(pstr, "s", &cstr);
    printf("%s\n", cstr);
    PyObject_SetAttrString(pmod, "X", pstr);
    (void) PyRun_String("print(transform(X))", Py_file_input, pdict, pdict);

    pstr = PyObject_GetAttrString(pmod, "message");
    PyArg_Parse(pstr, "s", &cstr);
    printf("%s\n", cstr);
    Py_DECREF(pstr);
    pfunc = PyObject_GetAttrString(pmod, "transform");
    pargs = Py_BuildValue("(s)", cstr);
    pstr  = PyEval_CallObject(pfunc, pargs);
    PyArg_Parse(pstr, "s", &cstr);
    printf("%s\n", cstr);

    pdict = PyDict_New();
    PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins( ));
    PyDict_SetItemString(pdict, "Y", Py_BuildValue("l", 2));
    PyRun_String("X = 99",  Py_file_input, pdict, pdict);
    PyRun_String("X = X+Y", Py_file_input, pdict, pdict);
    pval = PyDict_GetItemString(pdict, "X");
    PyArg_Parse(pval, "i", &cval);
    printf("%d\n", cval);

    Py_DECREF(pdict);
    Py_DECREF(pmod);
    Py_DECREF(pstr);
    Py_DECREF(pfunc);
    Py_DECREF(pargs); 

    Py_Finalize();

    return 0;
}

以上是一个c调用python的完整程序,包括调用接口的解释,以及一个要解析的py文件。

python用c语言编写的(当然也有其他语言实现版本),因此对c调用的支持是非常完善的,更详细的内容参考Python Manuals。

c调用python

时间: 2024-08-02 17:31:51

c调用python的相关文章

C++调用Python浅析

环境 VS2005Python2.5.4 Windows XP SP3 简述 一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性.而作为一门流行的通用型脚本语言python,也是可以做到的.在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据

C#调用python文件执行

我的电脑环境是使用.net framework4.5.1,如果在调试过程中调不通请注意 我用的是Visual studion 2017,python组件下载地址:http://ironpython.codeplex.com/releases/view/ 下载的版本是2.7,下载安装完之后记得引入安装路径下的以下三个dll (1)首先先说一个简单的功能,在c#代码中执行python字符串,内容如下: (2)c#调用python文件: 在当前目录下新建一个后缀名为py的文件,文件名为AmoutDis

编程:C#调用Python模块

当下,C#与Python都是比较热门的计算机编程语言,他们各有优缺点,如果能让他们互相配合工作,那是多么美好的事情,今天我来讲解一下如何利用C#来调用Python. 如果让C#支持调用Python模块,我们首先需要安装一些扩展,这里推荐使用IronPython库. 第一步,我们需要下载IronPython库的安装包,这里请大家移步官网 http://ironpython.codeplex.com/ ,下载并安装相关库文件. 第二步,我们新建一个C#控制台测试项目,并将IronPython安装目录

使用c语言调用python小结

最近在做一个漏洞展示平台,攻击实现部分使用python实现,c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块.针对c调用python,做个了小demo python模块:demo.py def print_arg(str): print str def add(a,b): print 'a=', a print 'b=', b return a + b class Class_A: def __init__(self): print "ini

PHP 调用Python脚本

上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apache服务,具体环境(LAMP)搭建就不细说,主要分享php调用python脚本后台运行的处理. 1. PHP如何调用外部程序 首先要解决的问题就是php如何调用python脚本,在PHP中调用外部程序主要有两个函数,system和exec. system()原型:string system(stri

c#中调用python

1. 安装IronPython,到http://ironpython.codeplex.com/下载安装包 2. 创建项目 创建一个C#的控制台应用程序. 添加引用: 浏览到IronPython的安装目录中,添加对IronPython.dll,Microsoft.Scripting.dll 两个dll的引用. 3. 添加Python文件到当前的项目中 创建一个文本文件命名为:hello.py, 编辑如下 def welcome(name):    return "hello" + na

C++调用python

本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command: 由 C++ 执行 shell code 3. exe_py: C++调用python文件 Code: include/util.h: /*************************************************************************** *- *

QT中 使用c++调用python

最近在做一个项目,开发环境用的是QT c++.项目中使用amazon云服务,调研发现有一个Amazon云的python接口.就有了标题中的问题,需要用C++来调用python脚本. 下面是一个c++调用python的小例子.我先贴出代码,然后在详细介绍. # -*- coding: cp936 -*- #定义hello函数,这个函数的功能是输出“hello world!” def hello(): print("hello world!") 上面就是我们一会要用C++调用python脚

浅析 C++ 调用 Python 模块

浅析 C++ 调用 Python 模块 作为一种胶水语言,Python 能够很容易地调用 C . C++ 等语言,也能够通过其他语言调用 Python 的模块. Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python 模块. 具体的文档参考官方指南: Embedding Python in Another Application 调用方法 1 链接到 Python 调用库 Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windo

Crontab里调用python脚本不成功的解决方案

crontab里经常会调用一些程序,但是很多时候调用python是不成功的,但是手动则是OK的,在看日志(/var/log/cron)的时候,却是显示正常,这种情况怎么破呢?其实主要就是这么几个地方: 1)轻易不要用if __name__ == "__main__": 很多主管都习惯让自己手下人把脚本写成模块化,然后潇洒的走一个整合,但是crontab对这个方法似乎不是很灵光,因为python运行的时候是从if __name__ == "__main__"开始执行,