c调用python第三方库_c/c++调用python程序且含tensorflow第三方库
对于纯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第三方库相关推荐
- aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- python安装c语言库_C语言扩展Python模块
一. main.cpp #include #include "Python.h" static PyObject* Py_Add_Formular(PyObject *self, ...
- c语言编写python库_c语言包装python程序
msdn上的例子: /* POPEN.C: This program uses _popen and _pclose to receive a * stream of text from a syst ...
- r语言和python的区别_c语言和python的区别
c语言和python的区别 1.语言类型不同. Python是一种动态类型语言,又是强类型语言.它们确定一个变量的类型是在您第一次给它赋值的时候.C 是静态类型语言,一种在编译期间就确定数据类型的语言 ...
- c语言python字典结构_C语言解析Python字典的代码实例
这里我们简单说一些背景,就是突然想写一点用C去写Python库的东西,下面的这些方法和用法大部分参考官方介绍 Python中字典 从参数中获取 从参数中获取的情况一般有两种,一般是我们如果明确了传入类 ...
- python购物代码_python简单的购物车程序(含代码)
效果图: ''' Created on 2017年9月4日 @author: len ''' product_list = [ ('Robot',200000), ('MacPro',12000), ...
- linux 查看系统函数库,教你在Linux操作系统中如何创建函数库
函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存 ...
- python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...
原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...
- python如何调用cpp文件的接口函数_C++中嵌入Python调用
python嵌入到C++中 把python嵌入的C++里面需要做一些步骤 安装python程序,这样才能使用python的头文件和库 在我们写的源文件中增加"Python.h"头文 ...
最新文章
- Miniconda3的环境配置
- 深度对抗学习在图像分割和超分辨率中的应用
- asp.net日历控件My97DatePicker下载地址
- 漫谈数据挖掘从入门到进阶
- 利用python进行数据分析D2——ch03IPython
- leetcode - 983. 最低票价
- JAVA8的新特性之Stream
- SPA优缺点、解决单页面应用的SEO困难问题以及三种网页渲染方式
- vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
- Python数据科学学习进阶
- 苹果Mac Spotify 音乐格式转换器推荐:Sidify Music Converter
- Caffe的各个版本简介
- 06 - JavaSE之常用类
- Oracle技术之使用dd复制asm中文件
- web - 前端特效和博客
- php chinese.php,ChineseUtil
- GitHub 漫游指南
- Android谷歌地图校正,在android中调整谷歌地图(api v2)缩放级别
- 用shell bash自动化程序
- 他一年写了200篇原创笔记,帮助你快速入门Python与机器学习