objectArx2016使用python3.9.7配置实践

ops/2025/2/13 5:09:15/

写在前面: 笔者有一些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
  • 五 安装使用numpy和pybind11
    • 5.1 安装
    • 5.2 配置vs的路径.
      • 1)新建属性
      • 2)设置用户宏
      • 3)使用用户宏

零 着重提醒

1.了解 "安装版python"路径和"安装版python"的第三方模块路径
2.virtualenv virtualenvwrapper-win 新建虚拟环境(conda稍显沉重)
3.修改"embed版本python"的 “python._pth"文件(embed可以调用下载的模块)
4.将3中修改后的"embed"拷贝到虚拟环境中,组成"发行版python”(再删一删多余的)
5.新建两个arx程序(pyArxEnter pyArx), pyArxEnter负责设置Paht并加载pyArx. pyArx负责调用Python

一 Python安装版本和embed版本

1.1 下载

pyhon下载连接: Python.org
笔者使用的是3.9.7
在这里插入图片描述

使用"安装版本",是方便配置embed版本.

1.2 安装版本的设置

1)安装参数设置

参数
安装路径C:\Program Files\Python39
Add to Path勾选影响windows环境变量PATH
(最好自己设置set PYTHONPATH=C:\Program Files\Python39)
再设置环境变量PATH=%PYTHONPATH%;%PYTHONPATH%\Scripts;%PATH%
Debug配置未选是否有 python39_d.lib(未实践)

2)安装版本Python内重要文件

Python程序内重要文件C:\Program Files\Python39影响配置
Python.h.\includevs2012–项目属性-附加头文件目录
Python39.lib.\libsvs2012–项目属性-附加库文件目录 和 附加依赖项
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

python39_pth_52">2) embed版本设置(python39._pth)

这段主要用来方便未来在"embed版本"中安装第三方库
操作步骤:在embed-pythonpython39._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时必要路径

如果没有设置上面的路径造成的后果

  1. cmd命令行下,输入python没有响应
  2. cmd无法执行安装第三方工具时的路径.(后期的python将下载的模块放到了C:\Users\%User%\AppData\Roaming)

下图演示了设置位置
在这里插入图片描述

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

使用virtualenv就是为了方便安装模块到embed-python

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

pythonpython397_117">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

pyArxEnter.arx中重要代码

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();}   

五 安装使用numpy和pybind11

5.1 安装

我们安装第三方模块到embed-python

c:>\workon python397
(python397)c:>\pip install numpy
(python397)c:>\pip install pytest
(python397)c:>\pip install pybind11

1.如果无法运行workon 就是没有把C:\Users\%User%\AppData\Roaming\Python\Python39\Scripts 加入到PATH中
2.(python397)就是表示安装numpy pytest pybind11 到embedpython中,也就是目录d:\Code\python_envs\python397\

5.2 配置vs的路径.

numpy 和 pybind11 都是在lib\site-packages下比较深的路径,因此用过vs的属性进行配置.

1)新建属性

"属性管理器"进入方法: vs菜单->视图>其他窗口>属性管理器
进入"属性管理器"页面上,pyArx①上点击右键,选择新建属性emPython. 就会在所有的配置新建上emPython ,见下面4个②

在这里插入图片描述

2)设置用户宏

在上图②上右键点击,选择"属性",进入下图"用户宏"(③), 再点击"添加宏"(④).按照下面列表层层定义路径.可以观察下图中红色方框和红色箭头.
下面的路径直接引用了上面定义的宏.
双击宏名称可以进行修改.
在这里插入图片描述

3)使用用户宏

回到"解决方案管理器"页面(⑤).
右键单击pyArx(⑥).选择"属性"页面.
点击对话框中的 c++ \ 常规 ⑦
编辑"附加包含目录"⑧
在对话框中可以直接使用$(numpy_inc) ⑨
在这里插入图片描述
之后在代码中就可以使用<numpy/arrayobject.h>这种短路径

#include "stdafx.h"
#include "pyTest.h"#include <Python.h>
#include <numpy/arrayobject.h> // Numpy头文
#include <pybind11/pybind11.h> //pybind11头文件

http://www.ppmy.cn/ops/157962.html

相关文章

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合&#xff08;Underfitting&#xff09;3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…

【Elasticsearch】bucket_sort

Elasticsearch 的bucket_sort聚合是一种管道聚合&#xff0c;用于对父多桶聚合&#xff08;如terms、date_histogram、histogram等&#xff09;的桶进行排序。以下是关于bucket_sort的详细说明&#xff1a; 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序&#xff…

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时&#xff0c;如果研究区较大&#xff0c;一个月的影像覆盖不了整个研究区&#xff0c;就会有缺失的地方&#xff0c;还有就是去云之后&#xff0c;有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…

企业如何利用DeepSeek提升网络安全管理水平

企业可以通过深度整合DeepSeek的AI能力&#xff0c;构建智能化、动态化的网络安全防御体系&#xff0c;以应对APT&#xff08;高级持续性威胁&#xff09;等复杂攻击。以下是具体策略与实践路径&#xff1a; 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…

计算机视觉-拟合

一、拟合 拟合的作用主要是给物体有一个更好的描述 根据任务选择对应的方法&#xff08;最小二乘&#xff0c;全最小二乘&#xff0c;鲁棒最小二乘&#xff0c;RANSAC&#xff09; 边缘提取只能告诉边&#xff0c;但是给不出来数学描述&#xff08;应该告诉这个点线是谁的&a…

游戏引擎学习第93天

回顾并推动进展 我们上一期的进展是&#xff0c;我们第一次开始填充可以任意旋转和缩放的固体形状。接下来我们希望继续推进图形功能&#xff0c;能够支持更多的特性&#xff0c;以便拥有一个真正的渲染器。 目前的目标是开始填充这些形状&#xff0c;并能够支持旋转、缩放&a…

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…

DeepSeek模型架构及优化内容

DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计&#xff1a; 采⽤Pre-Norm结构&#xff0c;并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network&#xff08;FFN&#xff09;的激活函数&#xff0c;中间层维度为8/3. 去除绝对位置编码&#xff0c;采⽤了…