C语言调用Python 混合编程
导语
Python有很多库,Qt用来编写界面,自然产生C++调用Python的需求。一路摸索,充满艰辛
添加头文件搜索路径,导入静态库
我的python头文件搜索路径:C:\Python27amd64\include
静态库在:C:\Python27amd64\libs
简易示例
//hello.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def xprint():
    print("hello !!")
//main.cpp
#include "Python.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
        Py_Initialize();/* 开始Python解释器 */
        PyRun_SimpleString("print 'python start'");
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append('C:\\Users\\Lution\\Documents\\moni\\py')");
        // 导入hello.py模块
        PyObject *pName = NULL;
        pName = PyString_FromString("hello");
        PyObject *pmodule =NULL;
        pmodule = PyImport_Import(pName);
        //调用函数xprint()
        PyObject *pfunc = PyObject_GetAttrString(pmodule, "xprint");
        PyObject_CallFunction(pfunc, NULL);
        Py_Finalize(); /* 结束Python解释器,释放资源 */
        return 0;
}
ERRORS
1、PyImport_Import或者PyImport_ImportModule总是返回为空
这个原因是,python源代码要和C语言编译后的exe同目录,而不是与C源代码同目录
否则使用PyRun_SimpleString("sys.path.append('C:\\Users\\Lution\\Documents\\moni\\py')");绝对路径指明python源代码位置,注意双斜杆。
注意这句PyRun_SimpleString("sys.path.append('./')");添加的当前目录是指exe的当前目录,不是C源码目录
2、缺少Python27_d.lib的解决方法
不要单纯地把Python27.lib伪造成Python27_d.lib,请修改Python.h
//修改Python.h
//修改前
#ifdef _DEBUG
# define Py_DEBUG
#endif
修改Python.h
//修改后
#ifdef _DEBUG
//# define Py_DEBUG
#endif
修改Python.h
//修改前
# ifdef _DEBUG
# pragma comment(lib,"python27_d.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */
修改Python.h
//修改后
# ifdef _DEBUG
# pragma comment(lib,"python27.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */
//修改object.h
//修改前
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif
//修改object.h
//修改后
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
// #define Py_TRACE_REFS
#endif
疑问
我发现程序执行的顺序出了点问题。在Py_Initialize();和Py_Finalize(); 之间的C语言代码会在Py_Finalize(); 之后执行
参考博文
缺少Python27_d.lib
PyImport_ImportModule总是返回为空
C语言调用Python 混合编程的更多相关文章
- 单片机C 语言与汇编语言混合编程
		
在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...
 - 在Qt(C++)中与Python混合编程
		
一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...
 - 小C和小派的缠绵爱情——C语言调用Python代码
		
我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...
 - 使用C语言调用mysql数据库编程实战以及技巧
		
今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...
 - keil C语言与汇编语言混合编程
		
C与汇编混合编程主要有以下几种:(1)C语言中嵌入汇编(2)无参数传递的函数调用(3)有参数传递的函数调用 一.C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #prag ...
 - c语言环境初始化&c语言和汇编混合编程
		
bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...
 - C语言与汇编语言混合编程实验
		
混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...
 - arm:c语言和汇编混合编程
		
仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...
 - 使用c语言调用python小结
		
近期在做一个漏洞展示平台,攻击实现部分使用python实现.c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块. 针对c调用python,做个了小d ...
 
随机推荐
- Hive 数仓中常见的日期转换操作
			
(1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...
 - Firefox 功能笔记
			
1.复制标签 说明:复制标签功能即新开一个与当前页一样的标签页,这个功能在Chrome中点击标签右键复制即可,但是在firefox中没有 Firefox中实现:Ctrl+拖动标签页
 - centos 6.5  防火墙开放指定端口
			
清除防火墙规则:iptables -F 关闭防火墙 /etc/init.d/iptables stop 关闭防火墙开机自启:chkconfig iptables off 查看iptables 是否开 ...
 - Vue2.0,Express实现的简单跨域
			
https://www.cnblogs.com/kevin-zjy-blog/p/7357220.html 1. 通过jsonp跨域2. document.domain + iframe跨域3. lo ...
 - JustOj 1910: 人见人爱A+B
			
[提交][状态][讨论版] 题目描述 北大的acm上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱. ...
 - <转>jmeter(七)定时器
			
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
 - 10分钟看懂!基于Zookeeper的分布式锁
			
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
 - maven war工程重命名
			
1,按f2对项目进行改名 2,改变其web.xml 的项目名 3,org.eclipse.wst.common.component 改变其项目名
 - Shell生成数字序列
			
转自http://kodango.com/generate-number-sequence-in-shell Shell里怎么输出指定的数字序列: for i in {1..5}; do echo $ ...
 - DBCP数据库连接池的使用
			
DBCP的简单介绍: DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由apache开发通过数据库连接池可以让程序自动管理数据库连接的释放和断开 ...