web-dev-qa-db-ja.com

致命的なPythonエラー:Py_Initialize:ロケールエンコーディングを取得できません

popen().を呼び出して、C++からpythonスクリプトを実行しようとしています。

重要なコードは次のようになります。

ostringstream command;
command<<"cd ; python3 piap.py "<<u<<" "<<rho;
if(!(in = popen(command.str().c_str(), "r"))){
    cout<<"some problem with the subprocess"<<endl;
}

popenpython3.5を呼び出してみましたが、何も変わりません。

ここでcppファイル全体を見つけることができます: http://Pastebin.com/KeXsgzjx しかし、残りは問題固有の定型文です。

コードは正常にコンパイルされますが、実行時に次のエラーメッセージが生成されます。

致命的なPythonエラー:Py_Initialize:ロケールエンコーディングを取得できません
ファイル "/home/lhk/programs/clion-2016.1.2/bin/gdb/lib/python2.7/encodings/init.py "、123行目でCodecRegistryErrorが発生します、\ ^ SyntaxError:無効な構文

現在のスレッド0x00007ffff7fd1700(最新の呼び出しが最初):中止(コアダンプ)

この質問の重複があります:

致命的なPythonエラー:Py_Initialize:ロケールエンコーディングを取得できません... SyntaxError:無効な構文Aborted(core dumped)

Bashは未知のコマンドでpythonを実行しようとし、Py_Initializeで失敗します

残念ながら、解決策は私にはうまくいきません:

  • 私はpythonpathを設定していません
  • pythonスクリプトは、#!/usr/bin/python3.5で正確なバージョンを指定します
  • 私の/usr/lib/command-not-foundは明示的に/usr/bin/python3を呼び出します

そして、このバグにはさらに多くのことがあります。

  1. 私のIDEであるClionに関連しているようです。エラーメッセージで確認できます。どういうわけかpythonインタープリターはclionディストリビューションからinitスクリプトをロードしようとします
  2. デバッグ中にのみ表示されます。リリースモードで実行した場合、popen()呼び出しは正常に機能します。

どのpythonバージョンがClionでデフォルトとして設定されているかを確認しました。これは3.5であり、正しいインタープリターでもあります。

私は迷っています、なぜ間違った通訳が選ばれているのですか?

3
lhk

異なるコンテキストVisIt プロットプログラムのインタラクティブ環境からpython3スクリプトを呼び出す場合)で同様の問題が発生しました。これが発生する理由は、明らかに、環境変数(特に、PATH)がPython3のシステム全体のインストールを無効にするローカル値に設定されているためです。

これを回避するには、 clean-slate env でPython 3を実行します。次のようになります。

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;
}
2
leftaroundabout