首页 > 编程语言 >使用c调用python

使用c调用python

时间:2022-10-09 15:59:54浏览次数:42  
标签:std 调用 string lib python initializer 使用 include

window

c调用python的原理大概是将python当做一个c++库来调用

导入头文件

将python的头文件复制到项目中,头文件在python安装目录中
image
在vs项目属性中的vc++目录的包含目录添加头文件路径
image

导入库文件

库文件在python安装目录的libs文件夹中
image
在vs项目属性中的vc++目录的库目录添加库文件所在文件路径
image
添加附加依赖项
python37.lib
python3.lib
python37_d.lib
image

添加二进制文件

需要的二进制文件有 python3*.dll、python3.dll、DLLs、Lib文件夹(注意Lib中的site-packages文件的第三方python库按实际需要增减)
image

使用api调用python代码

initializer.h

#pragma once
#include <Python.h>
#ifdef _WIN32
#include <Windows.h>
#elif defined __APPLE__

#endif
#include "utils.h"

class initializer {
public:
	initializer() {

	#ifdef _WIN32
	#include <Windows.h>
		SetDllDirectory(TEXT("python37\\"));
	#elif defined __APPLE__

	#endif
		Py_SetPythonHome(string2wstring(get_executable_dir()).c_str());
		Py_Initialize();
		PyRun_SimpleString("import sys");
		PyRun_SimpleString("sys.argv.append('1')");
		//PyRun_SimpleString("print(sys.path)");
	}
	~initializer() {
		Py_Finalize();
	}
};

utils.h

#include <iostream>


std::string get_executable_dir();
std::string wstring2string(const std::wstring& ws);
std::wstring string2wstring(const std::string& s);

utils_win.cpp

#include "utils.h"
#include <Windows.h>
#include <comutil.h>
using namespace std;
#pragma comment(lib , "comsupp.lib")
#pragma comment(lib , "comsuppw.lib")
std::string get_executable_dir() {
	 std::string exeDir = "";
	char szExeName[MAX_PATH] = {0,};
	volatile int lastIndex = 0;
	::GetModuleFileNameA(NULL, szExeName, MAX_PATH);
	exeDir = szExeName;
	lastIndex = exeDir.find_last_of("\\") + 1;
	exeDir = exeDir.substr(0, lastIndex);
	return exeDir;
}
std::string wstring2string(const wstring& ws)
{
	_bstr_t t = ws.c_str();
	char* pchar = (char*)t;
	string result = pchar;
	return result;
}
std::wstring string2wstring(const string& s)
{
	_bstr_t t = s.c_str();
	wchar_t* pwchar = (wchar_t*)t;
	wstring result = pwchar;
	return result;
}

main.cpp

#include <iostream>
#include "initializer.h"

using namespace std;
initializer  initer;

void call_main() {
	char* result;
	PyObject* pModule = PyImport_ImportModule("test");
	Sleep(0);
	if (pModule == NULL) {
		PyErr_Print();
		cout << "module not found" << endl;
		return ;
	}

	PyObject* pFunc = PyObject_GetAttrString(pModule, "main");
	if (!pFunc || !PyCallable_Check(pFunc)) {
		PyErr_Print();
		cout << "not found function init" << endl;
		return ;
	}
	
	PyObject* pReturn = PyObject_CallObject(pFunc, NULL);
	PyErr_Print();
}
void inputArgs(int argc, char** argv) {

	PyRun_SimpleString((string("sys.argv[0] = '") + argv[0] + "'").c_str());
	if(argc>1)
		for (int i=1;i<argc;i++)
			PyRun_SimpleString((string("sys.argv.append('")+argv[i]+"')").c_str());
}
int main(int argc,char ** argv)
{

	inputArgs(argc, argv);
	call_main();
	

	return 0;
}

编译出exe后在当前目录建立test.py
test.py

def main():
	print("hello world!")

将python3*.dll、python3.dll、DLLs、Lib文件夹放入exe当前目录即可执行成功

Macos

修改install_name
install_name_tool -change /Library/Frameworks/Python.framework/Versions/3.7/Python @loader_path/Python CPython++

标签:std,调用,string,lib,python,initializer,使用,include
From: https://www.cnblogs.com/czlnb/p/16661937.html

相关文章

  • Android dialog使用案例
    需求:应用锁,//自定义dialog的显示viewViewview=getLayoutInflater().inflate(R.layout.passwd_dialog_view,null);finalEditTexteditText=(EditText)view.findV......
  • servlet使用
    概述是运行在web服务器上的java程序,用来处理前端(客户端)的响应和请求生命周期Servlet对象是由tomcat服务器创建的。默认第一次浏览器中输入servlet访问时创建该对象,也可以通......
  • mysql之select使用篇1
    一、sql概述、规则数据导入1、sql概述sql有两个重要的标准分贝是sql92和sql96标准,今天使用sql一直遵循这两个标准,不通的数据库生产厂商都支持sql语句,但是也各有特有的内容2......
  • elasticsearch head、kibana 安装和使用
    一、概述1、展示es数据的可视化工具2、eshead可以当作数据展示查看的工具(数据概览),对于查询等操作使用kibana二、安装eshead推荐参考文档:​​Elasticsearch教程(四)elastic......
  • python递归算法
    递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调自己”,一个使用递归技术的方法将会直接或间接的调用自己。利用递归可以用简单的程序来解决......
  • ​sync.Pool 使用
    sync.Pool使用场景保存和复用临时对象,减少内存分配,降低GC压力例子typeStudentstruct{NamestringAgeint32Remark[1024]byte}varbuf,_=json.Marshal(Stu......
  • webpack使用
    一、概述模块化和打包 Webpack是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。从图中我们可以看......
  • npm使用
    一、简介1、什么是NPMNPM全称NodePackageManager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于前端的Maven......
  • 使用IDEA 打包项目的问题
     关于打包的问题,网上也是有很多帖子,真的都很不好用,如果IDEA 的版本不一致,也是不能用。这个还是比较好用的方式的。##将程序打成jar包,并且可运行。 确保依赖没有问题,......
  • pyquery使用
    frompyqueryimportPyQueryaspqfromlxmlimportetreeimporturllib#d=pq("<html></html>")#d=pq(etree.fromstring("<html></html>"))#d=pq(url=your_url)#d=pq(......