2012-06-27 22 views
5

私は、Pythonインタプリタと小さなスクリプトを組み込んだ単一の大きなバイナリを持っていたいと思います。私はこの完全な静的リンクに完全に新しく、& makeとGCCらを設定しています。してください、誰かが私にそのような実行可能ファイルを構築する基本的な手順を記述することができますか?Python埋め込み

私はMacOS 10.6で、Python 3.3 betaをダウンロードしました。そこで、私は "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"と "リンク"する必要がありますか?

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

また、私はこの "./configure"と "make"を試して、ビルド/ lib.macosx-10.6-x86_64-3.3というフォルダに* .soファイル(?)をたくさん入れましたが、何も "python"または類似のものと呼ばれる...?

+0

パスのヘッダファイル? –

+0

なぜPythonのベータ版を使用していますか?それに、Pythonをアプリケーションに静的にリンクさせても、Pythonコードなので、バイナリに単純にリンクすることはできません。 – ThiefMaster

+0

ベータ版は本当に気にしません。埋め込み手法がv2からv3に若干変更されたことを読んだだけです。 –

答えて

2

py2appの使用を検討しましたか?あなたがスクリプトを出荷し、Cコードを書かないことだけに興味があるなら、それはあなたのニーズをより良く満たすことができます。

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

+0

ありがとう、私はpy2appについて知っています。しかし、私が達成しようとしているのは、この埋め込みとコンパイルが、特にPythonのためにどのように動作するのかを知ることです。私はCのビットを書くようにしたいと考えています。 –

2

問題はgccがPythonインストールについて十分に知っていないと正常にすべてのヘッダをリンクされていないということです。 distutilsからその情報を取得し、その情報をgccに取得する方法を試してみる必要があります。これは、Pythonドキュメントの埋め込みセクションのLinking Requirementsでよりよく説明されています。

しかし、簡単な方法があります。 pymkfile.pyというスクリプトがあり、必要なすべての情報を含むmakeファイルが作成されます。 this tutorialのセクション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というファイルに保存します。実際にコードをビルドするためにmakeを実行して、今すぐ

$ pymkfile.py pystring > Makefile 

:まず、適したMakefileを構築 にスクリプトを使用します。最終的なアプリケーションを作成した後、 は、結果を確認するには、アプリケーションを実行します。あなただけのCラッパーを使用してPythonコードの単純なビットを実行してきました

$ ./pystring 

String execution 
rod, jane, freddy 

。 同じ基本的な手法を使用して、アプリケーションにPython埋め込み を使用するさまざまなタスクを実行できます。唯一の明らかな制限は、本質的に2つのコンポーネント が別々であることです。埋め込みPythonインタプリタ とホストCアプリケーションの間には通信がありません。

あなたはインタプリタにいくつかのコードを与え、それを実行して印刷しました。どのように のインタプリタからの出力を受け取り、それを印刷する必要はありませんでしたか?インタプリタは情報を直接標準出力に送りました。

+0

私は申し訳ありませんが、 1.)「Python installation」はありません。MacOSにはPythonがありますが、私がダウンロードしたソースファイルを使用しようとしています。 2。) "これは、アプリケーションが静的ランタイムライブラリ(libpython.a)にリンクされ、動的拡張(.soファイルとして実装)をロードする必要がある場合の問題です。 * .aまたは* .soが必要ですか?ソースファイルだけを使用することは可能ですか?申し訳ありません、私は、このすべてに非常に新しいです。 –

+0

MacOSに含まれているPythonインストールをお持ちで、Cプログラムを埋め込みPythonコードを実行するためにそのインストールに含まれるファイルにリンクする必要があります。これらのファイルがどこにあるのかをgccに伝えていないので、リンカ(インクルード)エラーが発生します。手動でソースファイルをインクルードすることは可能ですが、お尻の痛みです。代わりに私がリンクしているチュートリアルのスクリプトを使用してください。あなたのアプリケーションをPythonのインストールに適切にリンクさせるには、1) './pymkfile.py myCapp> Makefile'を実行し、makeファイルを作成します。2)' make' –

+0

' http://www.network-theory.co.uk/docs/gccintro/gccintro_16.html –

1

はまた、私はこの "./configureを" を試してみました( "作る" と、それは* .soのファイルの多くと "/ lib.macosx-10.6-x86_64-3.3を構築する" というフォルダを作った ?) しかし、 "python"などと呼ばれるものはありません...?

.soファイルはオブジェクトファイルです。あなたがmake installを呼び出し後にPythonの実行ファイルのみが生成されるので、3つのステップが:最後のステップは、通常

sudoは、あなたのシステムのPythonを交換しないことを確認してください含ま

./configure 
make 
make install 

こと。良い考えではありません。

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

Xcodeを使用することに悪影響を与えない場合は、Googleの「埋め込みPython OS X」だけでよいチュートリアルを見つけてください。

初めて私が行ったチュートリアルTHISを使用しました。