我正在尝试通过调用从 C++ 执行 Python 脚本popen().
重要的代码如下:
ostringstream command;
command<<"cd ; python3 piap.py "<<u<<" "<<rho;
if(!(in = popen(command.str().c_str(), "r"))){
cout<<"some problem with the subprocess"<<endl;
}
我也尝试过打电话python3.5
,popen
但没有任何改变。
你可以在这里找到整个 cpp 文件:http://pastebin.com/KeXsgzjx 但其余的只是针对特定问题的样板。
代码编译得很好,但在运行时,它会产生以下错误消息:
致命的 Python 错误:Py_Initialize:无法获取语言环境编码
文件“/home/lhk/programs/clion-2016.1.2/bin/gdb/lib/python2.7/encodings/在里面.py”, 第 123 行引发 CodecRegistryError,\ ^ SyntaxError: 语法无效当前线程 0x00007ffff7fd1700(最近调用优先):已中止(核心转储)
该问题有重复:
致命的 Python 错误:Py_Initialize:无法获取语言环境编码...SyntaxError:语法无效中止(核心转储)
Bash 尝试在未知命令上运行 python 并在 Py_Initialize 中失败
不幸的是,这些解决方案对我来说不起作用:
- 我还没有设置pythonpath
- 我的python脚本指定了确切的版本
#!/usr/bin/python3.5
- 我
/usr/lib/command-not-found
明确地调用/usr/bin/python3
这个漏洞还有更多问题。
- 它似乎与我的 IDE Clion 有关。您可以在错误消息中看到这一点。不知何故,python 解释器尝试从 clion 发行版加载初始化脚本
- 它只在调试期间出现。在发布模式下运行时,popen() 调用工作正常。
我检查了 Clion 中配置为默认的 Python 版本,它是 3.5,并且还有正确的解释器。
我很困惑,为什么选择了错误的解释器?
答案1
我遇到了类似的问题不同的背景(从交互环境中调用 python3 脚本时访问plot 程序)。发生这种情况的原因显然是,环境变量(特别是PATH
)被设置为本地值,从而禁用了 Python3 的系统范围安装。
你可以通过在重新开始env
。应该看起来像这样:
ostringstream command;
command<<"cd ; env -i bash -l -c 'python3 piap.py "<<u<<" "<<rho<<"'";
if(!(in = popen(command.str().c_str(), "r"))){
cout<<"some problem with the subprocess"<<endl;
}