有时候我们已有的代码库是c++的,但是我们要调用比如pytorch写的python文件,这时候就需要这样混合调用。有些文章写调用第三方库需要把python下面的Lib和DLL文件夹拷贝到release后的.exe在的文件夹下,事实上不需要这么做。按照我的步骤一步步做即可一般在Windows上写c++我们是用vs,这里以vs为例讲一讲这里面的坑。
如何利用visual studio调用以及调用的详细步骤
1.配置环境
要在 Visual Studio 中创建新c++ 项目,请选择“文件”>“新建”>“项目”。建好的解决方案如下
解决方案可以包括多个项目,为了编程方便,这边需要建立两个项目在同一个解决方案下面
如图所示,我这里建造了一个cpp项目和一个python项目,接下来右键点击TestPyCpp,选择属性选项。
这里要特别注意!!!,我安装的python是release版本,所以,解决方案配置为Release的x64
2.编写代码
新建一个cpp文件,代码如下:这里是用的<Python.h>而不是pybind11对python进行调用,编辑系统变量,设置python home很重要不然会报错。
exec(open(,那段话是python3直接启动.py文件的语句,这里我这么用是意图直接调用py文件。
cpp:
#include <Python.h>
#include <iostream>
#include <pybind11/pybind11.h>
void main() {
//需要进行强制类型转换
//否则报错“void Py_SetPythonHome(wchar_t *)”: 无法将参数 1 从“const wchar_t [44]”转换为“wchar_t *”
Py_SetPythonHome((wchar_t*)L"C:\\ProgramData\\Anaconda3"); // 编辑系统变量,设置python home
Py_Initialize();
PyRun_SimpleString("print('Hello Python!')\n");
PyRun_SimpleString("import os,sys");//执行import语句,把当前路径加入路径中,为了找到math_test.py
//PyRun_SimpleString("sys.path.append('./')"); //这句不用也可以,只是确保能找到py文件
PyRun_SimpleString("print(os.getcwd())");//测试打印当前路径
PyRun_SimpleString("exec(open('../Pythontest/read_table.py', encoding = 'utf-8').read())");//python3的exec方法
Py_Finalize();
}
新建一个python文件,注意import os下面的3句话,这三句话可以将以下几个路径添加到 system path variable(系统变量中).如果没有这句话,则会出现类似于以下报错
>>> import numpy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda3\envs\test\lib\site-packages\numpy\__init__.py", line 180, in <module>
from . import add_newdocs
File "C:\Anaconda3\envs\test\lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "C:\Anaconda3\envs\test\lib\site-packages\numpy\lib\__init__.py", line 8,
in <module>
from .type_check import *
File "C:\Anaconda3\envs\test\lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "C:\Anaconda3\envs\test\lib\site-packages\numpy\core\__init__.py", line 14, in <module>
from . import multiarray
ImportError: DLL load failed: The specified module could not be found.
路径
C:\ProgramData\Anaconda3\
C:\ProgramData\Anaconda3\bin
C:\ProgramData\Anaconda3\Scripts
C:\ProgramData\Anaconda3\Library\mingw-w64\bin (not strictly necessary)
C:\ProgramData\Anaconda3\Library\bin
py代码:
import os
base_path = r"C:\ProgramData\Anaconda3"
path = os.pathsep.join([os.path.join(base_path, i) for i in [r"", r"bin", r"Scripts", r"Library\mingw-w64\bin", r"Library\bin"]])
os.environ["PATH"]+=os.pathsep+path
import pandas as pd
if __name__ == "__main__":
print("PYTHONPATH:", os.environ.get('PYTHONPATH'))
print("PATH:", os.environ.get('PATH'))
a=pd.read_csv("../TestPyCpp/samples/Gd.s.csv")
print(a.x)
print("hahah")
接着调试即可出现以下内容