最近开始看《机器学习实战》这本书,这本书里面是用python实现了一些基本的算法,因此,首先需要搭建好python的开发环境。
一.相关版本
我的电脑:win8 64位
python版本:python-2.7.5.amd64?
Numpy函数库版本:www.hack95.com-amd64-py2.7
python插件版本:www.hack95.com-amd64-py2.7
VS版本:VS2010
二.搭建流程
1.安装python
下载地址:
http://www.hack95.com/ftp/python/2.7.5/python-2.7.5.amd64.msi
2.安装Numpy函数库
下载地址:http://www.hack95.com/s/13T2mM
3.安装针对VS2010的python插件
下载地址:http://www.hack95.com/soft/23586.html
4.打开VS2010,创建新工程,选择其他语言-python,再创建控制台程序即可。
VS2010下,C++调用python的环境,基于Python3.6.8-win32位
前言Miniconda的安装Miniconda虚拟环境配置VS2010环境配置(基于Win32平台)
前言
配置Theano + Scipy + Python + VS2010 C++ 开发环境。 由于单位开发环境较老,使用的是VS2010的Win32平台开发,因此考虑到32位与64位不能兼容,使c++能正确调用Python,踩遍CSDN上的坑,若开发环境为64位基本操作差不多,不过时刻牢记Python位数与C++环境位数应该对应相同才能互相调用。
总结如下工作配置环境流程:
Miniconda的安装Miniconda虚拟环境配置VS2010环境配置(基于Win32平台)
Miniconda的安装
之所以选择Miniconda而不是Anaconda,不外乎是32位的考虑,安装32位miniconda对应python版本即为32位,不用过多考虑其他问题,链接:Miniconda官网。
下载安装时不推荐添加到环境变量,这样可以使conda的环境与现有Python环境分开,虽然不方便使用,但是便于管理。安装完成会有对应Anaconda Prompt(miniconda)的命令行快捷方式生成。
Miniconda虚拟环境配置
打开Prompt命令行,输入命令创建新的python环境: conda create -n your_env_name python=3.6.8 不是所有Python都有32位版本,华为开源Python镜像可以查询对应版本是否有32位(结尾是Win32即为32位)。
如果觉得安装慢,需要添加源,这里选择Anaconda清华源。
搜索电脑里有没有 .condarc 文件,有则点开编辑;无则命令行输入conda config --set show_channel_urls yes即可生成对应文件;文件打开粘贴如下内容即可。
channels:
- defaults
show_channel_urls: true
channel_alias: https://www.hack95.com/anaconda
default_channels:
- https://www.hack95.com/anaconda/pkgs/main
- https://www.hack95.com/anaconda/pkgs/free
- https://www.hack95.com/anaconda/pkgs/r
- https://www.hack95.com/anaconda/pkgs/pro
- https://www.hack95.com/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://www.hack95.com/anaconda/cloud
msys2: https://www.hack95.com/anaconda/cloud
bioconda: https://www.hack95.com/anaconda/cloud
menpo: https://www.hack95.com/anaconda/cloud
pytorch: https://www.hack95.com/anaconda/cloud
simpleitk: https://www.hack95.com/anaconda/cloud
安装会加速很多很多。创建完成后安装想要的包即可,这里为了神经网络安装: 激活环境:conda activate your_env_name 安装Scipy:conda install scipy 安装机器学习库Theano:conda install theano
VS2010环境配置(基于Win32平台)
本机Minicodna安装在E:\miniconda下,虚拟环境则在该目录的env目录下,假设创建的虚拟环境为py36,那么对应虚拟环境路径为 E:\miniconda\envs\py36
公司环境为VS2010,Win32,创建项目选对应的: 创建成功后上方应显示 Debug 和 Win32。 右键项目,点击最下方属性,弹出属性页: ① 添加附加包目录:E:\miniconda\envs\py36\include; ②添加附加库目录: E:\miniconda\envs\py36\libs; ③添加Python36_d.lib debug模式下需要python36.lib的debug版本python36_d.lib,复制粘贴重命名为python36_d.lib即可。 ④复制Python36.dll python36.lib链接着python36.dll,经常会因为找到了lib文件找不到dll文件报错,复制python环境目录下的(既E:\miniconda\envs\py36)python36.dll ,粘贴到项目的debug目录下即可。 ⑤再不放心 现在在CPP中#include "Python.h""已经不会找不到库,为保险起见,在程序中再设置个PythonHome,本机中数据类型不一样导致不能直接传Char[ ]进Py_SetPythonHome() , 因此定义个wchar_t[]才能正确传递地址进去,不会报错。
#include "stdafx.h"
#include "Python.h"
int main()
{
wchar_t wszStr[] = L"E:\\miniconda\\envs\\py36";
Py_SetPythonHome(wszStr);
Py_Initialize();
PyRun_SimpleString("import os");
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('.')");
PyRun_SimpleString("from hello import *");
PyRun_SimpleString("print_hello()");
Py_Finalize();
system("pause");
return 0;
}
再有其他错误基本上也是python少个包什么的,直接安装就好,debug弹出的窗口会告诉问题出在哪里。
1、? 安装python3.7
2、? Vs2010中配置python:
3、添加头文件:#include
4、问题:error LNK2001: 无法解析的外部符号 __imp__Py_Initialize@0
原因: 由于Python版本和项目编译版本不匹配导致这个问题,本文出错的原因是
解决: 1. 使用 Python x86版本,VS项目更改为Win32,包含目录及库目录一律为Python x86,可正常编译
2.?使用 Python x64版本,通过配置管理器,在活动解决方案平台中新建X64平台,包含目录及库目录一律为Python x64,可正常编译
5、问题:error MSB6006:"CL.exe"已退出,代码为5
解决:在更改VC++目录时,改每个目录要注意把下面的“从父级或项目默认设置继承”勾选上。
VS调用python常用接口:
void Py_Initialize(void)
初始化Python解释器,如果初始化失败,继续下面的调用会出现各种错误,可惜的是此函数没有返回值来判断是否初始化成功,如果失败会导致致命错误。
int Py_IsInitialized(void)
检查是否已经进行了初始化,如果返回0,表示没有进行过初始化。
void Py_Finalize()
反初始化Python解释器,包括子解释器,调用此函数同时会释放Python解释器所占用的资源。
int PyRun_SimpleString(const char *command)
实际上是一个宏,执行一段Python代码。
PyObject* PyImport_ImportModule(char *name)
导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。
PyObject* PyModule_GetDict( PyObject *module)
相当于Python模块对象的dict属性,得到模块名称空间下的字典对象。
PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)
执行一段Python代码。
int PyArg_Parse(PyObject* args, char* format, …)
把Python数据类型解析为C的类型,这样C程序中才可以使用Python里面的数据。
PyObject* PyObject_GetAttrString(PyObject *o, char*attr_name)
返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句,o.attr_name。
PyObject* Py_BuildValue(char* format, …)
和PyArg_Parse刚好相反,构建一个参数列表,把C类型转换为Python对象,使得Python里面可以使用C类型数据。
PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)
此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。