写在前面: 笔者有一些python代码, 需要结合到cad二次开发的项目中,并使用embed版本进行发布.记录一下配置过程,并加些分析,以备后期查用.
ObjectArx配置Python
- 零 着重提醒
- 一 Python安装版本和embed版本
- 1.1 下载
- 1.2 安装版本的设置
- 1)安装参数设置
- 2)安装版本Python内重要文件
- 1.3 embed版本的设置
- 1) 下载embed版本,解压缩
- 2) embed版本设置(python39._pth)
- 二 "安装版本"中的几个路径
- 2.1 安装版本的几个路径
- 1) 环境变量Path中Python的路径
- 2) "安装版本"的第三方安装模块路径
- 三 使用虚拟环境 virutalenv来配置embed
- 3.1 在"安装版本"下安装virtualenv和virutalenvwrapper-win
- 3.2 使用虚拟环境
- 1)新建目录
- 2)设置环境变量 WORKON_HOME
- 3)新建环境
- 4)新建环境后会自动进入虚拟环境,安装numpy
- 5) 将embed-python中的内容拷贝到"python397"目录中
- 四 Vs2012配置两个arx项目
- 4.0 使用Vs中ObjectArx wizard新建两个dll文件
- 4.1 设置环境变量_putenv
零 着重提醒
1.了解 "安装版python"路径和"安装版python"的第三方模块路径
2.virtualenv virtualenvwrapper-win 新建虚拟环境
3.修改"embed版本python"的 "python._pth"文件
4.将3中修改后的"embed"拷贝到虚拟环境中,组成发行版
5.新建两个arx程序, pyArxEnter负责设置Paht和加载pyArx
一 Python安装版本和embed版本
1.1 下载
pyhon下载连接: Python.org
笔者使用的是3.9.7
使用"安装版本",是方便配置embed版本.
1.2 安装版本的设置
1)安装参数设置
参数 | ||
---|---|---|
安装路径 | C:\Program Files\Python39 | |
Add to Path | 勾选 | 影响windows环境变量PATH |
Debug配置 | 未选 | 是否有 python39_d.lib(未实践) |
2)安装版本Python内重要文件
Python程序内重要文件 | C:\Program Files\Python39 | 影响配置 |
---|---|---|
Python.h | .\include | vs2012–项目属性-附加头文件目录 |
Python39.lib | .\libs | vs2012–项目属性-附加库文件目录 和 附加依赖项 |
python39.dll | .\ | 运行时.要设置环境变量 PATH=C:\Program Files\Python39;%PATH% |
1.3 embed版本的设置
1) 下载embed版本,解压缩
embed版本 | 没有的东西 |
---|---|
1 | 没有 include文件夹 (自然也没有python.h) |
2 | 没有 libs文件夹 (自然也没有python39.lib) |
3 | 没有 Lib\site-packages 文件夹 使用了 .\python39.zip表示模块库 |
embed版本 | 有的东西 |
---|---|
1 | 只有python39.dll文件. |
因此编译C++项目时,确实是需要"安装版本python"中的python.h python39.lib | |
而embed版本仅仅用来发行.embed版本有python39.dll |
2) embed版本设置(python39._pth)
这段主要用来方便未来在"embed版本"中安装第三方库
操作步骤:在embed-python中python39._pth 新增路径
.\Lib\site-packages(见下图)
这个路径是告诉 embed的python以后第三方库也到 .\Lib\site-package中找
二 "安装版本"中的几个路径
2.1 安装版本的几个路径
1) 环境变量Path中Python的路径
系统环境变量Path应该设置为:
Path=C:\Program Files\Python39;C:\Users\%User%\AppData\Roaming\Python\Python39\Scripts;…其他路径…
1.Python程序根目录 | C:\Program Files\Python39\ | cmd执行Python.exe必要路径 |
2.PythonScript目录 | C:\Users\%User%\AppData\Roaming\ Python\Python39\Scripts | cmd执行如workon.bat时必要路径 |
如果没有设置上面的路径造成的后果
- cmd命令行下,输入python没有响应
- cmd无法执行安装第三方工具时的路径.
下图演示了设置位置
2) "安装版本"的第三方安装模块路径
第三方 | 模块安装路径 |
---|---|
早期 | Python安装路径下的 Lib\site-packages C:\Program Files\Python39\Lib\site-packages |
后期(3.9.7也这样) | 放到了用户目录下的 C:\Users\%User%\AppData\Roaming\Python\Python39\Scripts |
所以以上目录都需要设置系统环境变量Path,以保证cmd时能正确执行命令
三 使用虚拟环境 virutalenv来配置embed
3.1 在"安装版本"下安装virtualenv和virutalenvwrapper-win
pip install virtualenv
pip install virtualenvwrapper-win
virtualenvwrapper-win的使用方法
3.2 使用虚拟环境
1)新建目录
d:\Code\python_envs\
2)设置环境变量 WORKON_HOME
set WORKON_HOME=d:\Code\python_envs
未来所有虚拟环境都在这个目录下.
注意: 这个目录也只有 Lib\site-package等会变动的东西,其他固定不变的,还是使用原始"安装程序"内的东西.
3)新建环境
新建环境python397
c:\>mkvirtualenv python397
D盘中就出现目录:
d:\Code\python_envs\python397\
4)新建环境后会自动进入虚拟环境,安装numpy
在虚拟环境python397中安装numpy
(python397)c:\>pip install numpy
特别注意:如果使用下列命令切换时,找不到workon.bat时,应该看下"2.1安装版本的几个路径"这个章节.
c:\>workon python397
5) 将embed-python中的内容拷贝到"python397"目录中
"embed版本"解压缩出来的所有文件(注意要修改过 python39._pth后的),拷贝到虚拟环境"python397"目录中,
这样通过虚拟环境和"embed版本"组成了最后的发行包.
四 Vs2012配置两个arx项目
未来发布的arx程序是安装到用户的电脑中的,所以不会要求用户安装python.因此我们需要以下两个arx
pytArxEnter | 配置 Path环境路径 |
pytArx | 用来调用Python函数的arx文件 |
4.0 使用Vs中ObjectArx wizard新建两个dll文件
主要是可以快速的设置各种ObjectArx的头文件和库文件路径
4.1 设置环境变量_putenv
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;_putenv("PATH=d:\\Code\\python_envs\\python397;%PATH%"); Loader load;load.Do();return (retCode) ;}bool Loader::Do()// 加载指定ARX模块
{const wchar_t* arxPath = L"d:\\Code\\CodeTest\\arx\\Zx\\x64\\Release\\zxpyArx.arx"; // ARX文件完整路径 AcRxDynamicLinker* pLinker = acrxDynamicLinker;bool es = pLinker->loadModule(arxPath, true);// 检查模块是否已加载 if (!es) {acutPrintf(_T("\n错误:无法加载ARX文件 (错误码 %d)"), es);return false;} else {acutPrintf(_T("\nARX模块加载成功"));return true;}}
4.2 pytArx 调用 python
新建一个MyMy命令 调用一下函数
std::wstring pyTest::test()
{std::wostringstream out;// 指向嵌入式Python目录 Py_SetPythonHome(L"d:\\Code\\python_envs\\python397"); // 初始化Python环境 Py_Initialize();if (!Py_IsInitialized()) {out << L"Failed to initialize Python.";return out.str();}// 初始化Numpy import_array();// 执行Python代码:创建Numpy数组 PyRun_SimpleString("import numpy as np\n""arr = np.array([1, 2, 3])\n""print('Numpy array:', arr)");// 从Python全局命名空间获取数组对象 PyObject* main_module = PyImport_AddModule("__main__");PyObject* global_dict = PyModule_GetDict(main_module);PyObject* arr = PyDict_GetItemString(global_dict, "arr");// 转换为C++数据类型 if (arr && PyArray_Check(arr)) {PyArrayObject* np_arr = (PyArrayObject*)arr;int* data = (int*)PyArray_DATA(np_arr);int length = 3;out << L"\nC++ received array: ";for (int i = 0; i < length; ++i) {out << data[i] << L" ";}out << std::endl;}else {out << L"Failed to retrieve numpy array." << std::endl;}// 清理资源 Py_DECREF(arr);Py_Finalize();return out.str();}