自定义插件框架中嵌入python脚本环境的注意问题

    为方便用户以及程序员在插件框架中快速的进行二次开发,同时满足各插件之间互相调用但又不互相依赖,我们需要在插件框架中嵌入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);
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值