5

Pythonインタープリターと小さなスクリプトを埋め込んだ単一の大きなバイナリが欲しいです-私はこの全体の静的リンク、構成と作成、およびGCCなどにまったく慣れていません。そのような実行可能ファイルを作成する際の基本的な手順を教えてください。

私は MacOS 10.6 を使用しています。Python 3.3 ベータ版をダウンロードしました。次に、「test.c」を作成しました。

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print('Today is', ctime(time()))\n");
  Py_Finalize();
  return 0;
}

現在、フォルダーには、「Python-3.3.0b1」フォルダーと「test.c」ファイルの両方があります。

私が入力した:

gcc -I ./Python-3.3.0b1 -o test test.c

しかし、多くの「インクルード」エラーが発生しました。

しかし、これが正しい方法であるかどうかさえわかりません..?最初に何らかの方法で Python だけをビルドしてから、「test.c」と「リンク」する必要がありますか?

ところで、Python がリリースされた場合、"./configure" と "make" の同じ手順を使用しますか? 彼らはいくつかの特別なオプションを使用していますか、それとも python.org から提供されたものと非常によく似た (同じ) Python 実行可能ファイルをビルドできますか?

また、この「./configure」と「make」を試したところ、「build/lib.macosx-10.6-x86_64-3.3」というフォルダーが作成され、*.soファイルがたくさんありましたが(?)、「python」と呼ばれるものはありません" または類似...?

4

3 に答える 3

3

問題は、gcc が Python のインストールについて十分に認識しておらず、すべてのヘッダーを適切にリンクしていないことです。distutilsからその情報を取得し、その情報を gcc に取得する方法を見つけ出す必要があります。これについては、Python ドキュメントの埋め込みセクションのリンク要件で詳しく説明されています。

しかし、もっと簡単な方法があります。必要なすべての情報を含むファイルをpymkfile.py作成するというスクリプトがあります。このチュートリアルmakeのセクション 4 を参照してください。

セクション4から、あなたがやろうとしていることと非常によく似た例:

Python コードを埋め込む最も簡単な方法は、PyRun_SimpleString() 関数を使用することです。この関数は、1 行のコードをインタープリターに送信します。インタープリターは永続的であるため、インタラクティブな Python セッションで個々の行を入力するのと似ています。つまり、コードの各行で PyRun_SimpleString を呼び出すことにより、インタープリターに対して新しい行を実行できます。たとえば、次のコードは単純な Python プログラムを実行して、文字列を分割して再構築します。

#include <Python.h>
int main()
{
printf("String execution\n");
Py_Initialize();
PyRun_SimpleString("import string");
PyRun_SimpleString("words = string.split('rod jane freddy')");
PyRun_SimpleString("print string.join(words,', ')");
Py_Finalize();
return 0;
}

基本的な構造がシンプルであることがわかります。初期化とファイナライズのステップがあり、その間に Python インタープリターの呼び出しが埋め込まれています。プログラムをコンパイルするには、コードをコピーして pystring.c という名前のファイルに保存します。まず、スクリプトを使用して適切な Makefile を作成します。

$ pymkfile.py pystring > Makefile

次に、実行makeして実際にコードをビルドします。最終的なアプリケーションが作成されたら、アプリケーションを実行して結果を確認します。

$ ./pystring

String execution
rod, jane, freddy

C ラッパーを使用して、簡単な Python コードを実行しました。同じ基本的な手法を使用して、アプリケーションに組み込まれた Python を使用するさまざまなタスクを実行できます。唯一の明白な制限は、本質的に、2 つのコンポーネントが分離されていることです。組み込みの Python インタープリターとホスト C アプリケーションとの間に通信はありません。

つまり、インタープリターにコードを与えると、インタープリターはそれを実行して出力しました。インタープリターから出力を取得する必要がないことに注意してください。次に、それを印刷します。インタープリターは情報を直接標準出力に送信しました。

于 2012-06-27T15:05:01.763 に答える
2

py2app の使用を検討しましたか? スクリプトを出荷することだけに関心があり、C コードを書くことに関心がない場合は、ニーズにより適している可能性があります。

http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html

于 2012-06-27T14:52:46.187 に答える
1

また、この「./configure」と「make」を試してみたところ、「build / lib.macosx-10.6-x86_64-3.3」というフォルダがたくさんの*.soファイル(?)で作成されましたが、「python」というものはありません。 " または類似...?

.soファイルはオブジェクトファイルです。Python実行可能ファイルは、呼び出した後にのみ生成されるmake installため、次の3つの手順を実行します。

./configure
make
make install

その最後のステップには通常、sudo

システムのPythonを置き換えていないことを確認してください。良い考えではありません。

OS Xを使用している場合、通常の方法はOSXPythonシステムフレームワークとリンクすることです。これは「埋め込まれたPython」のように見えますが、既存のシステムPythonにリンクしています。システムのPythonリンクターゲットlibpython.dylib/usr/lib

Xcodeの使用に不利でない場合は、Googleが「PythonOS Xを埋め込んだ」だけで、優れたチュートリアルを見つけることができます。

このチュートリアルを初めて使用しました。

于 2012-06-27T21:03:02.260 に答える