質問: random.choice(list_data) return b ```
回答: C/C++からPythonを実行する場合、少なくともPython本体のDLLが必要になります。Windows版Python3.6であれば、Python36.dllがそれにあたります。しかし、このDLLにはPythonのビルドインオブジェクトや関数しかありません。Libにあるような`import`して使う各ライブラリは使えないということです。しかし、もっと深刻なことがあります。それは、`Py_Initialize()`が内部でencodingsライブラリを使っていると言うことです(ライブラリのロード等でファイルシステムの名前をエンコードするために使っていると推測されます)。そのため、DLLだけでは、つまりライブラリのファイルがなければ、`Py_Initialize()`すら出来ないというのがこの現象です。 この現象を解消するにはDLLだけではなく標準ライブラリもセットにして、exeと同じファイルに置く必要があります。しかし何を置いて良いのかよくわからないとお思いでしょう。そんなときのためにライブラリがセットになって組込に使える一式が用意されています。 Python Releases for Windows | Python.org 通常の"Windows x86|x86-64 web-based|executable installer"というファイルの他に"windows x86|x86-64 embeddable zip file"というのがあるのがわかると思います。このファイルをダウンロードして、展開したファイルの中身**全て**をexeと同じ場所に置きます。はい、これで完了です。x86(32bit)版とx86-64(64bit)版の二つが用意されていることに注意してください。これはexeのアーキテクチャに合わせる必要があります。 これは組み込み用のファイル一式です。Python本体である"Python3x.dll"の他、標準ライブラリがセットになっています。コンパイルが必要なものはコンパイル済みであり、コンパイルが不要なPythonで出来たファイルは"python3x.zip"の中にまとめて入っています。"python3x._pth"にはどこからライブラリを探すのかという情報がのっており、そこには"python3x.zip"と"."(カレントディレクトリ)が記載されています。"python3x.zip"のなかには"encodings"のライブラリが入っていますので、エラーは回避できるようになるでしょう。 参考: 3.6 Python 埋め込みのための配布 — Python 3.6.5 ドキュメント 配布物のサイズをコンパクトにしたいというのであれば、コンパイル済みライブラリ(pydファイル)や"python3x.zip"を展開して不要な物を削っていくしかありません。しかし、依存関係やPython内部のソースを確認しながらの作業となりますので、苦労の割にはあまり効果がないとかも知れません。(そもそも一番大きいPython3x.dllは本体なので削除は出来ませんし)