您的位置:首页 > 编程语言 > Python开发

自定义插件框架中嵌入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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: