94987


## 概要

Python.hを使ってC++からPythonスクリプトを実行したいのですが、下記のエラーが発生してしまいます

[code]

    Fatal Python error: initfsencoding: unable to load the file system codec
    ModuleNotFoundError: No module named 'encodings'
    
    Current thread 0x00007c54 (most recent call first):
    
[/code]

これを解消するにはどうすればよいでしょうか?

## 環境

Python: 3.7.5  
Vsiual Studio 2019  
Windows10

### Python環境の詳細

venvを使った仮想環境を作っており、この仮想環境で実行したPythonでは正しくスクリプトを実行できることを確認しています  
スクリプトを実行しているPCには他のバージョンのPythonも混在しており、仮想環境も複数作っております

### 作成したコード

C++

[code]

    #include<stdio.h>
    #include<Python.h>
    #include<string>
    #include<iostream>
    
    using namespace std;
    int main() {
        int result = 0;
        wchar_t* program = Py_DecodeLocale("venv-myenv\\Scripts\\python.exe", NULL);
        Py_SetProgramName(program);
        Py_Initialize();
    
        return 0;
    
    }
    
[/code]

Python

[code]

    a = [1, 2, 3, 4, 5]
    print(sum(a))
    
[/code]

C++コードはPy_Initialize()で発生しております

### 試したこと

  * std::systemを使ったスクリプト実行  
-> 標準モジュールを使ったスクリプトの実行はできましたが、外部モジュール(torchなど)を使ったスクリプトが実行できず、Python.hを使った方法に方針転換しました
  * PYTHONPATHの設定  
-> 環境変数にvenv-myenv\Scripts\python.exeを絶対パスで指定してPCを再起動しましたが、変化ありませんでした


CC BY-SA 4.0
2023-05-25T02:17:20.313
94968
2023-05-26T22:48:38.743
19500
question
python c++ visual-studio
PythonスクリプトをC++から実行するときのエラーを解消したい


質問を読み返してみたのですが、最終的にやりたいことは、「Pythonの仮想環境にインストールした外部モジュール(torchなど)を使ったPythonスクリプトを、C++で実行したい」ということでしょうか？

であれば、

> std::systemを使ったスクリプト実行  
>  ->
> 標準モジュールを使ったスクリプトの実行はできましたが、外部モジュール(torchなど)を使ったスクリプトが実行できず、Python.hを使った方法に方針転換しました

これを動くようにする、というのが一番無難な解決策のような気がします。

* * *

それでも、PythonのAPIを使った方法を取りたいというのであれば、という話をしますが、ただ以下の話は少しは試したこともありますが、同様の環境は作れないので、それなりに憶測は入っています、とあらかじめ断っておきます。

* * *

「仮想環境が入っている環境で動かす」ということが前提であれば、「 **embeddable版を使用せず** 」、「
**`Py_SetProgramName`を使用せず**」、単に仮想環境内の「`python.exe`」があるディレクトリ(おそらく`Scripts`ディレクトリだと思いますが）に、ビルドした実行ファイルを置くだけで動くと思います。

それ以外のディレクトリに実行ファイルを置くと、外部モジュールが参照できないはずです。  
ただし、環境変数「`PYTHONPATH`」やスクリプト内で「`sys.path`」を、外部モジュールがある仮想環境内の「`Lib/site-
packages`」ディレクトリを見るように設定すれば、参照できるかもしれません。

もしくは、`Py_SetProgramName`で仮想環境の`python.exe`を指定すればいいはずなのですが、ちょうど「Windows/Python3.7」の環境で試してみたのですが、エラーは出ないものの、仮想環境のライブラリを見ることができない(`sys.path`が適切に設定されない)ということがありました。  
(他のOS/バージョンであれば、動くことは確認できたのですが）  
場合によっては、細かいConfig設定をしなければならないかもしれませんが、先の方法で動くのであればそちらで動かしたほうが手っ取り早いかと思います。

<https://docs.python.org/ja/3/c-api/init_config.html#initialization-with-
pyconfig>

* * *

embeddable版というのは、仮想環境や、そもそもベース環境すらない状況で動かすためのものです。

embeddable版の内容と実行ファイルを **全て同じディレクトリに置き** 、使用します。  
(コメントを見る限り、全てを同じディレクトリに置いていないように思えます）  
ただし、当然この中に外部モジュールは含まれていないので、なんとかしなければなりません。  
その説明をすると長くなるので、「仮想環境が入っていることが前提」であれば、まずは先述した方法を試してみた方がいいでしょう。


CC BY-SA 4.0
2023-05-26T22:48:38.743
94987
2023-05-26T22:48:38.743
15473
94968
answer