解决方案:c调用python,PyImport_Import或者PyImport_ImportModule总是返回为空

下面c_python_utils.h是处理工具函数,test.cpp是测试程序,hello.py是python类

可是当我集成到项目中的时候,PyImport_Import总是返回为空起初我以为是init()中设置目录的问题,但是目录设置的是当前目录,hello.py也放在当前目录。

然而,然后让我发现项目是部署在服务器上的,而服务器上可执行文件在某个目录内,这个目录下根本就没有hello.py(因为我没有放进去)

所以,根本就在当前目录下找不到,就是这个小小的问题,都把我折腾了好久,现在想起来真是心伤啊。不过还是解决了。

/***************************************************************************************************
c_python_utils.hC++ Network Library, Copyright (c) Datatom Software, Inc.(2015)Author:liu.pan (liu.pan@datatom.com)Creating Time:2015-5-4
***************************************************************************************************/
#ifndef _DTCORE_C_PYTHON_UTILS_H_
#define _DTCORE_C_PYTHON_UTILS_H_#include <Python.h>
#include <stdio.h>#ifdef __cplusplus
extern "C" {
#endif /* C++ *//**
* 调用python类中的成员函数
* @param module python脚本名称,不含扩展
* @param class_name python类名称
* @param function python类成员函数
* @param format python类函数参数格式
* @return 返回字符串
*/
char* py_call( const char* module, const char* class_name, char* function, char* format, ... )
{PyObject* pName     = NULL;PyObject* pMod         = NULL;PyObject* pDict     = NULL;PyObject* pClass    = NULL;PyObject* pInstance = NULL;PyObject* pParam     = NULL;PyObject* pResult     = NULL;// 导入模块pName = PyString_FromString(module);pMod = PyImport_Import(pName);if( !pMod ){return "";}// 获取模块字典属性pDict = PyModule_GetDict(pMod);if ( !pDict ){return "";}// 通过字典获取模块中的类pClass = PyDict_GetItemString(pDict, class_name);if ( !pClass ){return "";}pInstance = PyInstance_New(pClass, NULL, NULL);if ( !pInstance ){return "";}pResult = PyObject_CallMethod(pInstance, function, format);char *rlt_ch = NULL;PyArg_Parse( pResult, "s", &rlt_ch );return rlt_ch;
}/**
* 一些环境的初始化
* 
*/
void init()
{Py_Initialize();PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");
}/**
* 逆初始化
*/
void finit()
{Py_Finalize();
}#ifdef __cplusplus
} /* extern "C" */
#endif /* C++ */#endif  //_DTCORE_C_PYTHON_UTILS_H_
// test.cpp

#include "c_python_utils.h"
#include <stdio.h>int main(int argc, char const *argv[])
{init();char* rlt_char = py_call("hello", "power", "liupan", "()");finit();printf("%s\n", rlt_char);return 0;
}
# hello.py
class power():def liupan(self):return "hello world"

总结

所以,如果PyImport_Import总是返回为空,一定是查询目录的问题,要么目录设置错误,要么python代码根本没有在这个目录内。

因为C调用python是运行时执行的,而不是编译时链接的。

转载于:https://www.cnblogs.com/panliu/p/4485183.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19个决定性时刻,2030年前,这些黑科技必将发生

来源&#xff1a;科技联盟技术中心摘要&#xff1a;从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其…

推荐两本移动开发挺火的书

移动开发最好的入门书&#xff0c;而且例子实战特别多&#xff0c;是大学生的首选。 转载于:https://www.cnblogs.com/book2006/p/4487688.html

Matlab——图像缩放(插值法)

实验内容&#xff1a; 用双线性内插法实现位深度为8的灰度图像的缩放。 思路&#xff1a; 输入原图像以及缩放后图像的像素要求&#xff08;宽度*高度&#xff09;&#xff0c;处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的&#xff0c;输入图像路径…

情感计算综述

来源&#xff1a;人机与认知实验室自然的齐一性指未检验过的物体将在某些相关的方面与我们已经检验过的同类物体相似。情感是人类智能的重要组成部分&#xff0c;是穿越理性的一把利器&#xff0c;然而&#xff0c;情感计算这一方向能否可行&#xff1f;如同形式化常识一样能否…

Matlab——对比度拉伸

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围&#xff0c;这种处理 对于强调感兴趣灰度区非常有用…

使用 JavaScript 实现简单候选项推荐功能(模糊搜索)【收藏】【转】

当我们使用 Google 等搜索功能时&#xff0c;会出现与搜索内容有关的候选项。使用 JavaScript 搜索字符串&#xff0c;通常会使用 indexOf 或者 search 函数&#xff0c;但是非常僵硬&#xff0c;只能搜索匹配特定词语。比如使用关键词 今天是星期几 想要检索 今天是星期五 这个…

形态学——腐蚀

1、基本概念 腐蚀 是一种消除连通域的边界点&#xff0c;使边界向内收缩的处理。 例如&#xff1a; 注&#xff1a;图像画面上边框处不能被结构元素覆盖的部分可以保持原来的值不变&#xff0c;也可以置为背景。 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定…

从现在到未来50年,传感器将如何改变世界?

来源&#xff1a;资本实验室2011年&#xff0c;网景公司创始人与风险投资家马克安德森提出了非常具有创见&#xff0c;而且已经成为现实的观点&#xff1a;“软件正在吞噬世界”。到今天&#xff0c;如果把句子中的“软件”替换为“传感器”&#xff0c;这一观点同样适用。自传…

开发过程中编写的一些批处理

1.BuildRelease.bat 用于不开启VS直接编译、部署、创建和恢复快照 WindowsPhone APP&#xff0c;注册WindowsPhone手机。 进行了编译和部署的效果&#xff1a; BuildRelease.bat 1 echo off2 pushd "%~dp0"3 title Build Release4 set folder%CD%5 set MSBUILD%windi…

形态学——膨胀

1、基本概念 膨胀是将与目标区域的背景点合并到该目标物中&#xff0c;使目标物边界向外部扩张的处理。 例如&#xff1a; 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定位在背景像素上&#xff0c;判断是否覆盖有目标点&#xff0c;来确定是否该点被膨胀为目标…

剖析20世纪未来出行 这些畅想21世纪能成吗?

来源&#xff1a;popsci编译&#xff1a; 网易智能 (乐邦)近年来有关飞行汽车、超级高铁、喷气背包、无人驾驶汽车等新型交通工具的报道一直不绝于耳&#xff0c;但目前这些领域的产品似乎都还算不上真正切实可行。说好的移动出行未来在哪里呢&#xff1f;人们梦寐以求的这些交…

11. javacript高级程序设计-DOM扩展

1. DOM扩展 1.1 选择符API l querySelector() 接收一个css选择符&#xff0c;返回与该模式匹配的第一个元素 l querySelectorAll() 接收一个css选择符&#xff0c;返回所有匹配的NodeList元素 1.2 HTML5 1.2.1 与类相关的扩充 l getElementsByClassName() 接收一个参数&#xf…

图像分割——迭代式阈值分割

1、算法步骤&#xff1a; &#xff08;1&#xff09;预定义两阈值之差dt &#xff08;2&#xff09;选定初始阈值T0&#xff08;一般为图像的平均灰度&#xff09; &#xff08;3&#xff09;用T分割图像为G1、G2两组&#xff0c;G1由灰度值大于T的所有像素组成&#xff0c;…

第一本用机器生成的书籍由施普林格•自然出版

Lithium-Ion BatteriesA Machine-Generated Summary of Current Research来源&#xff1a;Springer丨公众号摘要&#xff1a;这本创新的原型书引人入胜地概述了锂离子电池的最新研究。与德国法兰克福大学应用计算语言学实验室合作开发的一种算法自动编写了这本书。施普林格•自…

根据文件扩展名获取系统图标

1 /// <summary>2 /// 根据文件后缀名获取系统图标。3 /// </summary>4 /// <param name"extension"></param>5 /// <returns></returns>6 public static ImageSource GetIconByExt…

2019全球AI人才分布图:美国占44%,中国人才净流入

来源&#xff1a;网络大数据人工智能技术正在快速发展&#xff0c;而各国对于AI人才的需求是没有止境的&#xff1a;大家都在培养和争夺人才上做文章。前不久&#xff0c;教育部批准了国内35所大学的人工智能本科专业;加拿大正希望通过“全球技能战略签证”吸引国外人才流入。今…

区域生长算法原理及MATLAB实现

1. 基于区域生长算法的图像分割原理 数字图像分割算法一般是基于灰度值的两个基本特性之一&#xff1a;不连续性和相似性。前一种性质的应用途径是基于图像灰度的不连续变化分割图像&#xff0c;比如图像的边缘。第二种性质的主要应用途径是依据实现指定的准则将图像分割为相似…

UTF8有BOM和无BOM

UTF-8 不需要 BOM&#xff0c;尽管 Unicode 标准允许在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是标准形式&#xff0c;在 UTF-8 文件中放置 BOM 主要是微软的习惯&#xff08;顺便提一下&#xff1a;把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明&#xff0…

给初学者们讲解人工神经网络(ANN)

1. 介绍 这份教学包是针对那些对人工神经网络&#xff08;ANN&#xff09;没有接触过、基本上完全不懂的一批人做的一个简短入门级的介绍。我们首先简要的引入网络模型&#xff0c;然后才开始讲解ANN的相关术语。作为一个应用的案例&#xff0c;我们解释了后向传播算法&#x…

Receiver type ‘X’ for instance message is a forward declaration

引用的问题。 ARC要求完整的前向引用&#xff0c;也就是说在MRC时代可能只需要在.h中申明class就可以&#xff0c; 但是在ARC中如果调用某个子类中未覆盖的父类中的方法的话&#xff0c;必须对父类.h引用&#xff0c;否则无法编译。 在一个类中使用MRC 其中引用使用class 另一个…