致命的 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:无法加载文件系统编解码器
python setup.py安装错误LNK2019:函数致命错误LNK1120中引用的无法解析的外部符号fmin:
安装 Anaconda 2 后出错:致命 Python 错误:Py_Initialize:无法加载文件系统编解码器