7

標準ライブラリなしでpythonを埋め込むことは可能ですか?

私はpython 2.7.6のcmakeビルドを使用しており、次のように基本的な組み込みスクリプトを実行しています。

#include <stdio.h>
#include <Python.h>

int main(int argc, char *argv[]) {

  /* Setup */
  Py_SetProgramName(argv[0]);
  Py_Initialize();

  /* Run the 'main' module */
  int rtn = Py_Main(argc, _argv);
  Py_Finalize();

  return rtn;
}

..しかし、実行すると、次のようになります。

ImportError: No module named site

正しい $PYTHONHOME をセットアップすると、問題なく動作します。しかし、それは私がやろうとしていることではありません。標準ライブラリなしでスタンドアロン アプリケーションに python のコピーを埋め込もうとしています。

私はそれを使用して感謝していますが、この特定の組み込み環境では、親アプリケーションによって公開された特定のライブラリのみが利用可能な lua に似たものが必要です (ただし、明らかに Python 構文を使用します)。

これには、クロスリンクされたすべての動的ライブラリを含む標準ライブラリの配布 (または構築) を気にしないという追加のボーナスがあります。

これはすべてとして可能ですか?それとも、標準ライブラリの一部である sys.path、import、{}、[] などの言語の基本的なブロックが欠落していることに必然的に遭遇するのでしょうか?

可能であれば、どのように実行しますか?

4

2 に答える 2

11

簡単な答えは、できます。

int main(int argc, char *argv[]) {

  /* Setup */
  Py_NoSiteFlag = 1; // <--- This
  Py_SetProgramName(argv[0]);
  Py_Initialize();

  /* Run the 'main' module */
  int rtn = Py_Main(argc, argv);
  Py_Finalize();

  return rtn;
}

私が知る限り、何も壊れることはなく、すべて (モジュールのインポート機能を含む ~) を完全に問題なく使用し続けることができます。バンドルされていない標準ライブラリから何かをインポートしようとすると、次のようになります。

>>> import os;
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named os

興味のある方のために、コードのコピーをここに残しておきます。

https://github.com/shadowmint/cmake-python-embed-nostdlib

于 2014-01-07T08:53:53.167 に答える