自定义插件框架中嵌入python脚本环境的注意问题
2012-03-14 18:17
603 查看
为方便用户以及程序员在插件框架中快速的进行二次开发,同时满足各插件之间互相调用但又不互相依赖,我们需要在插件框架中嵌入python环境。但由此带来两个问题,一个是部署问题,即需要用户分别部署Python环境和我们的插件框架环境;另一个问题是,当用户对独立部署的python环境升级时,往往给原本可以正常工作的脚本代码带来潜在的错误,如从Python3.1升级Python3.2时,往往带来字符串编码的解码问题,从而使得我们的插件框架因为对外部环境的依赖而变得不稳定。所以我们需要一个内嵌的、不依赖于外部环境的Python解释器,这样可以减少一次部署,并消除插件框架对外部环境依赖(绿色软件)。为嵌入一个独立的Python环境,可以采用以下方式:
1、在应用程序目录下拷贝一份独立的python环境(注意从Windows系统目录如”C:/windows/system32“下拷贝对应的python3x.dll文件到python目录的dlls子目录下);
2、在插件初始化时添加应用程序路径到环境变量"Path"中;
3、在插件框架运行时加载期间根据"runtime"XML描述强制加载特定版本的Python动态链接库;如:
<runtime>
<library name="python32" directory="python32/DLLs" file="python32.dll" file-debug="python32.dll" version="3.2.2" />
</runtime>
4、建立Python会话环境时,使用动态链接库,采用运行时加载的方式,得到初始化流程函数地址;
5、根据加载的python模块(python3x.dll)得到python路径,并在调用调用Py_Initialize之前得到"Py_SetPythonHome"地址并使用当前Python路径调用它;如
//设置python模块路径(必须在非系统目录下)
HMODULE hModule = reinterpret_cast<HMODULE>(m_hModulePython);
static wchar_t szPythonPathName[MAX_PATH] = L"";
::GetModuleFileNameW(hModule,szPythonPathName,MAX_PATH);
wchar_t szSystemDirectory[MAX_PATH] = L"";
::GetSystemDirectoryW(szSystemDirectory,MAX_PATH);
if(wcsnicmp(szPythonPathName,szSystemDirectory,wcslen(szSystemDirectory)) != 0)
{
wchar_t* pSplash = std::max(wcsrchr(szPythonPathName,L'\\'),wcsrchr(szPythonPathName,L'/'));
*pSplash = 0;
do
{
pSplash = std::max(wcsrchr(szPythonPathName,L'\\'),wcsrchr(szPythonPathName,L'/'));
if(wcsnicmp(pSplash + 1,L"python",6) == 0)
break;
else
*pSplash = 0;
}while(true);
void (*Py_SetPythonHome)(wchar_t*) = 0;
GetProcAddressFromLibrary(hModule,"Py_SetPythonHome",Py_SetPythonHome);
Py_SetPythonHome(szPythonPathName);
}
1、在应用程序目录下拷贝一份独立的python环境(注意从Windows系统目录如”C:/windows/system32“下拷贝对应的python3x.dll文件到python目录的dlls子目录下);
2、在插件初始化时添加应用程序路径到环境变量"Path"中;
3、在插件框架运行时加载期间根据"runtime"XML描述强制加载特定版本的Python动态链接库;如:
<runtime>
<library name="python32" directory="python32/DLLs" file="python32.dll" file-debug="python32.dll" version="3.2.2" />
</runtime>
4、建立Python会话环境时,使用动态链接库,采用运行时加载的方式,得到初始化流程函数地址;
5、根据加载的python模块(python3x.dll)得到python路径,并在调用调用Py_Initialize之前得到"Py_SetPythonHome"地址并使用当前Python路径调用它;如
//设置python模块路径(必须在非系统目录下)
HMODULE hModule = reinterpret_cast<HMODULE>(m_hModulePython);
static wchar_t szPythonPathName[MAX_PATH] = L"";
::GetModuleFileNameW(hModule,szPythonPathName,MAX_PATH);
wchar_t szSystemDirectory[MAX_PATH] = L"";
::GetSystemDirectoryW(szSystemDirectory,MAX_PATH);
if(wcsnicmp(szPythonPathName,szSystemDirectory,wcslen(szSystemDirectory)) != 0)
{
wchar_t* pSplash = std::max(wcsrchr(szPythonPathName,L'\\'),wcsrchr(szPythonPathName,L'/'));
*pSplash = 0;
do
{
pSplash = std::max(wcsrchr(szPythonPathName,L'\\'),wcsrchr(szPythonPathName,L'/'));
if(wcsnicmp(pSplash + 1,L"python",6) == 0)
break;
else
*pSplash = 0;
}while(true);
void (*Py_SetPythonHome)(wchar_t*) = 0;
GetProcAddressFromLibrary(hModule,"Py_SetPythonHome",Py_SetPythonHome);
Py_SetPythonHome(szPythonPathName);
}
相关文章推荐
- sublime 3 注册码+PYTHON 环境配置+pylint插件path问题+package control找不到packages解决方法。
- Ubuntu中配置Python开发环境(PyDev插件问题)
- 在crontab中执行python脚本系统环境变量问题
- sublime python环境(代码自动补全,调试python脚本等插件)
- 插件框架一之解决插件布局自定义组件无法使用问题
- Python for .net脚本调用dotnet框架(ref和out参数问题)
- Python脚本完美解决Linux环境解压.zip文件乱码问题
- 在Mac中使用vue-cli搭建的vue框架,下载到win7环境中,配置应该注意的问题
- linux 下配置python 以及 python脚本的移植需要注意的问题
- VS2010环境下,c++嵌入Python环境配置问题
- 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)
- sublime python环境(代码自动补全,调试python脚本等插件)
- Python常见问题解决办法之:环境搭建
- Struts2验证器(验证器框架流程,自定义验证器,注意事项)
- 解决pip安装的包无法在anaconda 的python 环境下使用的问题
- python安装xlrd和xlwt两个插件来处理excel问题
- freeswitch嵌入python脚本
- python脚本 汉字问题的解决
- 【从零开始】Python的框架Flask环境配置流程以及Postman使用(第一课)
- Android开发环境搭建--完美解决eclipse安装Genymotion插件找不到图标问题