web-dev-qa-db-ja.com

標準ライブラリなしでPython3を埋め込む

編集:私はここで反対の質問をしました: Python3を標準ライブラリに埋め込む方法

Python2のソリューションは次のとおりです。 標準ライブラリなしでpythonを埋め込むことは可能ですか?

ただし、Python3はPy_Initialize();で次のように失敗します。

Fatal Python error: Py_Initialize: unable to load the file system  
codec ImportError: No module named 'encodings'

Py3ソースファイルはデフォルトでutf-8であるため、これは理にかなっています。したがって、py3ソースファイルを解析するためだけに外部バイナリが必要なようです。

じゃあ何をすればいいの?

システムPythonインストールで、encodingsバイナリを見つけ、これをプロジェクトツリーにコピーし、環境変数PYTHONPATH(?)を設定する必要があるようです。私のlibpython.dylibはそれを見つけることができます。

これを回避することは可能ですか?そうでない場合、誰かが私が取る必要のある手順を明確にすることができますか?これ以上の問題はありますか?


注:後世のために、これは私がOSX上の私のプロジェクトにリンクするスタンドアロンのlibpython.dylibを取得した方法です:

まず、システムのPythonライブラリを見つけます:/usr/local/Frameworks/Python.framework/Versions/3.4/Python(私の場合はhomebrewでインストールされました)。

今私は:

  • .dylibをプロジェクトフォルダにコピーして./Libs/libpython3.4.1_OSX.dylibを作成します

  • build settings -> linkingに移動し、other linker flags-lpython3.4.1_OSXに設定します

この時点で、機能しているように見えます。ただし、新しいOSXインストールでビルドしようとすると、失敗します。それの訳は:

$ otool -D ./libpython3.4.1_OSX.dylib 
./libpython3.4.1_OSX.dylib:
/usr/local/Frameworks/Python.framework/Versions/3.4/Python

.dylibはまだ古い場所を保持しています。 .dylibにその場所へのリンクが含まれているのは私には本当に奇妙です。それを使用するものはすべて、最初にそれを呼び出すためにそれがどこにあるかを知っている必要があるからです。

これは次の方法で修正できます。

$ install_name_tool -id @rpath/libpython3.4.1_OSX.dylib libpython3.4.1_OSX.dylib

しかし、Xcodeプロジェクトでも、次のことを行う必要があります。

  • build phasesに移動します。 copy filesFrameworksにコピーするlibpython3.4.1_OSX.dylibステップを追加します(これは適切な場所です)。
  • build settings -> linkingに移動し、runpath search paths@executable_path/../Frameworks/libpython3.4.1_OSX.dylibに設定します

最後に、edit scheme -> run -> arguments -> environment variablesに移動し、PYTHONHOMEに値../Frameworksを追加する必要があります。

これを機能させるには、PYTHONPATHも追加する必要があると思います。

リンク:
https://mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
http://qin.laya.com/tech_coding_help/dylib_linking.html
https://github.com/conda/conda-build/issues/279#issuecomment-67241554
Mac OsXでMach-Oライブラリがどのように機能するかを理解するのを手伝ってくれませんか?
http://nshipster.com/launch-arguments-and-environment-variables/

49
P i

私はこれを試みましたが、PythonライブラリなしでPython 3を埋め込むのに費やすよりも時間がかかります。

ライブラリ内のいくつかのモジュールは、Python 3を実行するために必要であり、それらがなくても動作するには多くの変更が必要になります。

3
Alden