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

Posted

技术标签:

【中文标题】致命的 Python 错误:无法获取随机数来初始化 Python【英文标题】:Fatal Python error: failed to get random numbers to initialize Python 【发布时间】:2020-03-18 16:40:43 【问题描述】:

环境窗口 10、VSC 15

使用 CreateProcessA winapi 并传递 lp 环境变量来运行带有脚本的 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 运行成功,否则会打印“Fatal Python error: failed to get random numbers to initialize 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 会显示在任务管理器中。

【问题讨论】:

您的意思是您将 PYTHONPATH 设置为字符串文字“paths”? PYTHONPATH 应该是您项目的根目录。 PATH 应该是你的 /path/to/python 你说 '= "paths"' 是什么意思?? Python 需要访问系统的熵池来初始化自身。该消息告诉您 Python 无法访问,或者没有返回任何内容。 我更新了问题,你能复习一次吗? 请求让我知道上述代码 sn-p 中的问题是什么? 【参考方案1】:

你传递给CreateProcessA的环境必须包含SYSTEMROOT,否则初始化时在python内部调用Win32 API调用CryptAcquireContext会失败。

当将 NULL 作为 lpEnvironment 传递时,您的新进程将继承调用进程的环境,该环境已经定义了 SYSTEMROOT

【讨论】:

以上是关于致命的 Python 错误:无法获取随机数来初始化 Python的主要内容,如果未能解决你的问题,请参考以下文章

致命的 Python 错误:initfsencoding:无法加载文件系统编解码器

为set方法获取致命错误

python setup.py安装错误LNK2019:函数致命错误LNK1120中引用的无法解析的外部符号fmin:

安装 Anaconda 2 后出错:致命 Python 错误:Py_Initialize:无法加载文件系统编解码器

本机方法中的致命错误:在调试模式下启动 hybris 服务器时,JDWP 没有传输初始化错误

致命错误:无法声明类 ProductFilterIterator,因为该名称已在