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 "init"
def fun(self, str):
print 'hello', str
return str class dedecms_get_webshell:
def __init__(self):
'''''
'''
self._run = True #must rewrite function
def check(self,site,port):
'''''
'''
print "Exploiting Host:%s,Port:(%d)......" % (site,port)
flag = 1
if flag:
content={"flag":1,"content":"POST http://www.baidu.com/shell.php (cmd)"}
else:
content={"flag":0,"content":"POST http://www.baidu.com/shell.php (cmd)"}
return content
if __name__=="__main__":
site="www.baidu.com"
port=80
obj = dedecms_get_webshell()
ret=obj.check(site,port)
print ret

分析:

1. print_arg定义了一个传参的函数

2. add 定义了一个传如多个参数,且有返回值的函数

3. Class_A定义了一个类及类的一个方法fun(传参数,有返回值)

4. dedecms_get_webshell定一个了类及类的一个方法check(传多个参数,返回值是个元组)

下面使用c语言调用demo.py文件中的函数。

测试函数:

    #include <Python.h>  

    int main(int argc, char* argv[])
{
test();
test1();
test2();
test3();
test4(); return 0;
}

逐个分析:

//导出当前环境变量

    void getcurrent()
{
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
return;
}

1. 一个最基本的调用方式

    void test()
{
Py_Initialize();//初始化python
PyRun_SimpleString("print 'hello python'");//直接运行python代码
Py_Finalize(); //释放python
return;
}

分析:直接运行python 代码,在调用的时候必须先做初始化操作(Py_Initialize),调用完后做清理工作(Py_Finalize)

2. 调用模块中的一个普通函数

    void test1()
{
Py_Initialize();//初始化python
getcurrent(); PyObject *pModule = NULL, *pFunc = NULL, *pArg = NULL;
pModule = PyImport_ImportModule("demo");//引入模块
pFunc = PyObject_GetAttrString(pModule, "print_arg");//直接获取模块中的函数
pArg = Py_BuildValue("(s)", "hello_python"); //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
PyEval_CallObject(pFunc, pArg); //调用直接获得的函数,并传递参数 Py_Finalize(); //释放python
return;
}

分析:先引用模块(PyImport_ImportModule),然后获取模块中的函数(PyObject_GetAttrString),对c传入python 的参数做类型转换(Py_BuildValue("(s)","hello_python")),最后直接调用函数并传递参数(PyEval_CallObject)。

3. 调用模块中的一个函数(多参数,带返回值)

    void test2()
{
Py_Initialize();
getcurrent(); PyObject *pModule = NULL, *pDict = NULL, *pFunc = NULL, *pArg = NULL, *result = NULL;
pModule = PyImport_ImportModule("demo"); //引入模块
pDict = PyModule_GetDict(pModule); //获取模块字典属性 //相当于Python模块对象的__dict__ 属性,得到模块名称空间下的字典对象
pFunc = PyDict_GetItemString(pDict, "add"); //从字典属性中获取函数
pArg = Py_BuildValue("(i, i)", 1, 2); //参数类型转换,传递两个整型参数
result = PyEval_CallObject(pFunc, pArg); //调用函数,并得到python类型的返回值
int sum;
PyArg_Parse(result, "i", &sum); //将python类型的返回值转换为c/c++类型
printf("sum=%d\n", sum); Py_Finalize();
}

4. 调用模块中简单的一个类(单个返回值)

    void test3()
{
Py_Initialize();
getcurrent(); PyObject *pModule = NULL, *pDict = NULL, *pClass = NULL, *pInstance = NULL, *result = NULL;
pModule = PyImport_ImportModule("demo"); //引入模块
pDict = PyModule_GetDict(pModule); //获取模块字典属性
pClass = PyDict_GetItemString(pDict, "Class_A"); //通过字典属性获取模块中的类
pInstance = PyInstance_New(pClass, NULL, NULL);//实例化获取的类
result = PyObject_CallMethod(pInstance, "fun", "(s)", "python_000"); //调用类的方法
char* name=NULL;
PyArg_Parse(result, "s", &name); //将python类型的返回值转换为c/c++类型
printf("%s\n", name); Py_Finalize();
}

5. 调用模块中一个简单的类(返回值是个元组)

void test4()

{

    Py_Initialize();

    getcurrent();

    PyObject *pModule = NULL, *pDict = NULL,*pClass = NULL, *pInstance = NULL, *result = NULL;

    pModule =PyImport_ImportModule("demo"); //引入模块

    pDict = PyModule_GetDict(pModule); //获取模块字典属性

    pClass = PyDict_GetItemString(pDict,"dedecms_get_webshell"); //通过字典属性获取模块中的类

    pInstance = PyInstance_New(pClass, NULL,NULL);

    result = PyObject_CallMethod(pInstance,"check", "(s,i)", "www.baidu.com", 80);

    int flag;

    char*content = NULL;

    PyObject *obj_content =PyDict_GetItemString(result, "content");

    content = PyString_AsString(obj_content);

    PyObject *obj_flag =PyDict_GetItemString(result, "flag");

    flag = PyInt_AsLong(obj_flag);

    printf("content: %s, flag: %d\n",content, flag);

    Py_Finalize();

}

Makefile书写:

    all: test  

    test: pytest.o
gcc -L/usr/lib/python2.7/ -lpython2.7 -ldl pytest.o -o test pytest.o: pytest.c
gcc -g -std=gnu99 -Wall -c pytest.c -I/usr/include/python2.7/ clean:
@rm -rf *.o *.pyc test

C语言调用Python的更多相关文章

  1. 小C和小派的缠绵爱情——C语言调用Python代码

    我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...

  2. C语言调用Python 混合编程

    导语 Python有很多库,Qt用来编写界面,自然产生C++调用Python的需求.一路摸索,充满艰辛 添加头文件搜索路径,导入静态库 我的python头文件搜索路径:C:\Python27amd64 ...

  3. 使用c语言调用python小结

    近期在做一个漏洞展示平台,攻击实现部分使用python实现.c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块. 针对c调用python,做个了小d ...

  4. C 语言调用python 脚本函数

    刚好几个月前做过,C++ 函数里面先加载python 脚本,再调用 里面的 def 函数,我把代码贴出来,你在main 函数里面,调用getDataByScript 函数,另外相同目录下放一个 fuc ...

  5. 浅析 C++ 调用 Python 模块

    浅析 C++ 调用 Python 模块 作为一种胶水语言,Python 能够很容易地调用 C . C++ 等语言,也能够通过其他语言调用 Python 的模块. Python 提供了 C++ 库,使得 ...

  6. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  7. Python语言学习之C++调用python

    C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进 ...

  8. 『Python CoolBook』C扩展库_其六_从C语言中调用Python代码

    点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILStat ...

  9. Java-调用R语言和调用Python(前后端展示)

    1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...

随机推荐

  1. Mybatis中insert中返回主键ID的方法

    <insertid=“doSomething"parameterType="map"useGeneratedKeys="true"keyProp ...

  2. symfony 使用原始sql

    $this->get('database_connection')->fetchAll('select * from book where book.id=3')

  3. SpringMVC学习指南-前言

    SpringMVC是Spring框架中用于Web应用快速开发的一个模块. SpringMVC基于Spring框架.Servlet和JSP. ------------------------------ ...

  4. CentOS 7 执行级别的切换

    CentOS 7 执行级别的切换 由命令行级别切换到窗体级别的命令未变:init 5或startx 由窗体级别切换到命令行级别的命令未变:init 3 新版本号的执行级别都定义在 /lib/syste ...

  5. web 开发之js---js获取select标签选中的值

    var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // 选中索引 va ...

  6. Java中try,catch,finally的用法

    Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch  运行流程:运行到try ...

  7. 【单独编译使用WebRTC的音频处理模块 - android】

    更新 [2015年2月15日] Bill 这段时间没有再关注 WebRTC 以及音频处理的相关信息,且我个人早已不再推荐单独编译 WebRTC 中的各个模块出来使用.实际上本文的参考价值已经很小了,甚 ...

  8. 基于Flink的视频直播案例(下)

    目录 直播数字化运营 结果写入Elasticsearch 第二种思路 Flink实现总结 Elasticsearch部分 Kibana部分 直播数字化运营 业务目标 全站观看直播总人数以及走势 房间直 ...

  9. 基于Spark和Tensorflow构建DCN模型进行CTR预测

    实验介绍 数据采用Criteo Display Ads.这个数据一共11G,有13个integer features,26个categorical features. Spark 由于数据比较大,且只 ...

  10. Oracle 10g 10.2.0.4的group by BUG |ORA-00979 not a GROUP BY expression|

    乍看 ORA-00979 not a GROUP BY expression 这个提示估计很快能将其定位为SQL语句写得有问题,实际上有可能你遇到了一个Oracle的BUG,这个BUG常见于10.2. ...