对于纯python程序而言,用c程序来调用是比较适合的,如果python程序中包含了其他第三方库,则调用极可能出错,且不易查明原因。如笔者曾用c程序调用包含tensorflow的python程序,有的可以成功,有的则卡在某条语句,百般尝试也未能实现。

一、纯python程序

以下程序编译环境为VS2013,,所用tensorflow版本为1.4.0 和1.9.0,python版本为3.6.2 。

所做设置也为调用tensorflow所准备,对于普通的python调用而言只多不少:

1、环境配置

需要安装anaconda软件

①将vs工程配置为X64平台

②包含目录 添加路径 D:\anaconda\include

③库目录 添加路径 D:\anaconda\libs

④附加依赖项 添加 python36.lib

2、编写代码如下:

.py文件需和编译生成的.exe文件放在一起

test.py代码

#coding:utf-8

import os

def run(com):

return com

def main():

print(run(("4",3)))

if __name__=='__main__':

main()

c.cpp代码

#include

#include

using namespace std;

int main()

{

//***python调用***//

//初始化python模块

Py_Initialize();

// 检查初始化是否成功

if (!Py_IsInitialized())

{

cout << "初始化失败" << endl;

Py_Finalize();

}

PyObject *pModule;

PyObject*pFunc = NULL;

PyObject*pArg = NULL;

pModule = PyImport_ImportModule("test");//Python文件名

if (!pModule) {

cout << "py文件导入失败" << endl;

Py_Finalize();

}

else{

pFunc = PyObject_GetAttrString(pModule, "run");//Python文件中的函数名

if (!pFunc) {

cout << "函数导入失败" << endl;

Py_Finalize();

}

PyObject* pyParams = Py_BuildValue("(s)","helllo world!");

/*PyObject* pyParams = PyTuple_New(2); //参数传递另外一种形式,待测试

PyObject* pyParams1 = Py_BuildValue("(s)", "5");

PyObject* pyParams2 = Py_BuildValue("(s)", "6");

PyTuple_SetItem(pyParams, 0, pyParams1);

PyTuple_SetItem(pyParams, 1, pyParams2);*/

char * result1;

pArg = PyEval_CallObject(pFunc, pyParams);//调用函数

PyArg_Parse(pArg, "s", &result1);

cout << result1<< endl;

PyObject* pyParams2 = Py_BuildValue("(i)", 123);

int result2;

pArg = PyEval_CallObject(pFunc, pyParams2);//调用函数

PyArg_Parse(pArg, "i", &result2);

cout << result2 << endl;

}

system("pause");

}

执行结果如图

以上python程序调用在输入一个参数返回一个参数时成功运行,但是改变c程序,若输入参数变为多个、输出参数也变为多个时运行出错,原因不明,还有待探索。

如果遇到

可将pyconfig.h文件中的python36_d.lib改为python36.lib即可成功运行。

二、含tensorflow第三方库

在调用含有第三方库的python程序时,首先需要保证在cmd下运行python程序无误。环境配置如上文所述,但是很多时候程序在

pModule = PyImport_ImportModule("test3");//Python文件名

这一行出错,pModule 结果为null,原因通常是import tensorflow as tf这一句未能成功调用,将需调用的python程序中只保留这一句,可轻松验证。

经探索,可在原cpp文件中加入命令行参数即可成功运行。

/**

*Copyright @ 2019 Zhang Peng. All Right Reserved.

*Filename:

*Author: Zhang Peng

*Date:

*Version:

*Description:

**/

#include

#include

using namespace std;

int main()

{

//***python调用***//

//初始化python模块

Py_Initialize();

// 检查初始化是否成功

if (!Py_IsInitialized()) {

printf("py_initialize failed");

}

PyObject *pModule;

PyObject*pFunc = NULL;

PyObject*pArg = NULL;

//main命令行参数

int argc = 1;

wchar_t * argv[] = { L" " };

PySys_SetArgv(argc, argv); //加入argv参数 否则出错

pModule = PyImport_ImportModule("test3");//Python文件名

if (!pModule) {

printf("cannot open module!");

Py_Finalize();

return 0;

}

else

{

pFunc = PyObject_GetAttrString(pModule, "run");//Python文件中的函数名

if (!pFunc) {

printf("cannot open FUNC!");

Py_Finalize();

return 0;

}

else

{

PyObject* pPath = Py_BuildValue("(s)", "7513.jpg");

pArg = PyEval_CallObject(pFunc, pPath);//调用函数

int result;

PyArg_Parse(pArg, "i", &result);

cout << "预测结果: " << result << endl;

}

}

system("pause");

return 0;

}

以上代码中重要的地方就是加入以下几行代码

//main命令行参数

int argc = 1;

wchar_t * argv[] = { L" " };

PySys_SetArgv(argc, argv); //加入argv参数 否则出错

c调用python第三方库_c/c++调用python程序且含tensorflow第三方库相关推荐

  1. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  2. python安装c语言库_C语言扩展Python模块

    一. main.cpp #include #include "Python.h" static PyObject* Py_Add_Formular(PyObject *self, ...

  3. c语言编写python库_c语言包装python程序

    msdn上的例子: /* POPEN.C: This program uses _popen and _pclose to receive a * stream of text from a syst ...

  4. r语言和python的区别_c语言和python的区别

    c语言和python的区别 1.语言类型不同. Python是一种动态类型语言,又是强类型语言.它们确定一个变量的类型是在您第一次给它赋值的时候.C 是静态类型语言,一种在编译期间就确定数据类型的语言 ...

  5. c语言python字典结构_C语言解析Python字典的代码实例

    这里我们简单说一些背景,就是突然想写一点用C去写Python库的东西,下面的这些方法和用法大部分参考官方介绍 Python中字典 从参数中获取 从参数中获取的情况一般有两种,一般是我们如果明确了传入类 ...

  6. python购物代码_python简单的购物车程序(含代码)

    效果图: ''' Created on 2017年9月4日 @author: len ''' product_list = [ ('Robot',200000), ('MacPro',12000), ...

  7. linux 查看系统函数库,教你在Linux操作系统中如何创建函数库

    函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存 ...

  8. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...

    原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...

  9. python如何调用cpp文件的接口函数_C++中嵌入Python调用

    python嵌入到C++中 把python嵌入的C++里面需要做一些步骤 安装python程序,这样才能使用python的头文件和库 在我们写的源文件中增加"Python.h"头文 ...

最新文章

  1. Miniconda3的环境配置
  2. 深度对抗学习在图像分割和超分辨率中的应用
  3. asp.net日历控件My97DatePicker下载地址
  4. 漫谈数据挖掘从入门到进阶
  5. 利用python进行数据分析D2——ch03IPython
  6. leetcode - 983. 最低票价
  7. JAVA8的新特性之Stream
  8. SPA优缺点、解决单页面应用的SEO困难问题以及三种网页渲染方式
  9. vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
  10. Python数据科学学习进阶
  11. 苹果Mac Spotify 音乐格式转换器推荐:Sidify Music Converter
  12. Caffe的各个版本简介
  13. 06 - JavaSE之常用类
  14. Oracle技术之使用dd复制asm中文件
  15. web - 前端特效和博客
  16. php chinese.php,ChineseUtil
  17. GitHub 漫游指南
  18. Android谷歌地图校正,在android中调整谷歌地图(api v2)缩放级别
  19. 用shell bash自动化程序
  20. 他一年写了200篇原创笔记,帮助你快速入门Python与机器学习

热门文章

  1. python数据分析与应用第五章实训 2_第五章实训(二)
  2. DSS 启动关闭脚本
  3. 说说JS在IE中的内存泄露问题
  4. seaborn绘图基础介绍
  5. OC和Clover黑苹果USB定制和注入
  6. 马氏距离进行离群值检测
  7. 我每次去德国出差必带的东西
  8. 检测样本分布是不是正态分布,绘制其正态分布概率图及异常值检测-python代码实现
  9. Cocos2d-x 屏幕适配
  10. 神舟笔记本(战神)摄像头或者相机不能使用的解决方法