gpt4 book ai didi

python - 致命的 Python 错误 : failed to get random numbers to initialize Python

转载 作者:行者123 更新时间:2023-12-03 06:55:22 26 4
gpt4 key购买 nike

致命的 Python 错误:无法获取随机数来初始化 Python

环境窗口 10,VSC 15

使用 CreateProcessA winapi 并传递 lpenvironment 变量以使用脚本运行 python。
当 lpenvironment 传递 null 时,它工作正常。
如果我设置环境变量 PATH 和 PYTHONPATH = "paths",并传递该 LPSTR(env.c_Str()),它会在运行时抛出上述错误。
python版本是3.5.6

有什么帮助吗?

还有一些细节。

  • 我使用 CreateProcessA WINAPI 运行子进程 python.exe "C:\Program Files\endpoint\Python_ML\mlprocessor_server.py"。
  • 我想用两个环境变量“PYTHONPATH”和“PATH”运行子进程。
    PYTHONPATH="C:\Program Files\endpoint\Python";"C:\Program Files\endpoint\Python\Scripts";"C:\Program Files\endpoint\Python\include";"C:\Program Files\endpoint\Python\Lib";"C:\Program Files\endpoint\Python\libs";"C:\Program Files\endpoint\Python\Lib\site-packages";"C:\Program Files\endpoint\Python_ML"
    PATH="C:\Program Files\endpoint\Python";"C:\Program Files\endpoint\Python\Lib";"C:\Program Files\endpoint\Python\Scripts";"C:\Program Files\endpoint\Python\libs"

  • 出于某种原因,CreateProcessA 中的第 7 个参数失败,如果为 null,则 python.exe 运行成功,否则打印“致命的 Python 错误:无法获取随机数来初始化 Python”。

    我设置参数的方式如下...

    std::string Base = Configuration::getBasePath();
    std::string environPython = Base;
    environPython.append("\\Python;");
    environPython.append(Base);
    environPython.append("\\Python\\Scripts;");
    environPython.append(Base);
    environPython.append("\\Python\\include;");
    environPython.append(Base);
    environPython.append("\\Python\\Lib;");
    environPython.append(Base);
    environPython.append("\\Python\\libs;");
    environPython.append(Base);
    environPython.append("\\Python\\Lib\\site-packages;");
    environPython.append(Base);
    environPython.append("\\Python\\_ML;");
    environPython.push_back('\0');


    std::string environPath = Base;
    environPath.append("\\Python;");
    environPath.append(Base);
    environPath.append("\\Python\\Lib;");
    environPath.append(Base);
    environPath.append("\\Python\\Scripts;");
    environPath.append(Base);
    environPath.append("\\Python\\libs;");
    environPath.push_back('\0');

    std::string cmd = Base;
    cmd.append("\\Python\\python.exe");
    std::string params = "\"";
    params.append(cmd);
    params.append("\" \"");
    params.append(Base);
    params.append("\\Python\\_ML\\mlprocessor_server.py\"");

    std::map env = { {“PYTHONPATH”,environPython.data() },
    {“路径”,environPath.data() }};
    // example for generating block of strings
    std::vector<char> envBlock;
    std::for_each(env.begin(), env.end(),
    [&envBlock](const std::pair<std::string, std::string> & p) {
    std::copy(p.first.begin(), p.first.end(), std::back_inserter(envBlock));
    envBlock.push_back('=');
    std::copy(p.second.begin(), p.second.end(), std::back_inserter(envBlock));
    envBlock.push_back('\0');
    }
    );
    envBlock.push_back('\0');

    // feed this into ::CreateProcess()
    LPVOID lpEnvironment = (LPVOID)envBlock.data();

    bool result = CreateProcessA(cmd.c_str(), (LPSTR)params.c_str(), NULL, NULL, FALSE, CREATE_NO_WINDOW, lpEnvironment, NULL, &info, &pi);

    结果始终为真,python.exe 未显示在任务管理器中并给出致命的 Python 错误:无法获取随机数来初始化 Python。

    如果 lpEnvironment 为 NULL,则任务管理器中会显示 python.exe。

    最佳答案

    你传给的环境CreateProcessA必须包括 SYSTEMROOT , 否则 Win32 API 调用 CryptAcquireContext在初始化期间在 python 内部调用时将失败。
    当传入 NULL 作为 lpEnvironment 时,你的新进程继承了调用进程的环境,它有 SYSTEMROOT已经定义。

    关于python - 致命的 Python 错误 : failed to get random numbers to initialize Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58997105/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com