web-dev-qa-db-ja.com

Cythonで実行可能ファイルを作成する

Cythonで遊んでいます。通常はPythonでプログラミングしますが、以前の人生ではCを使用していました。自立型の実行可能ファイルを作成する方法がわかりません。

私はcythonをダウンロードし、.pyxファイル(これは通常のPythonファイル)であり、Python =シェル、使用:import pyximport; pyximport.install()

次のコマンドラインで.cファイルを生成できます。cython file.pyx標準のsetup.pyをビルドして実行することで.soファイルを生成できます。

setup.py build_ext --inplace

さまざまなオプションを付けてgccを使用して.soファイルから実行可能ファイルを作成しようとしましたが、常に不足しているファイル、ヘッダーなどがたくさんあります。事実上どこからでもヘッダーをポイントしようとしましたが、成功しませんでした。すべてのgccオプションの機能、またはgccを使用する必要がある場合でも。

Pythonシェルでプログラムを実行できるが、コマンドラインでは実行できないという事実があるため、ここで接続が切断されています(ユーザーがシェル、インポートモジュールなど)。

ここで何が欠けていますか?

31
Paul Nelson

必要なのは、Cythonコンパイラーの_--embed_フラグです。そこにはたくさんのドキュメントはありませんが、- this は私が見つけたものです。簡単な実例にリンクしています。

CythonソースコードをCファイルにコンパイルして、実行可能ファイルにコンパイルできるようにするには、_cython myfile.pyx --embed_のようなコマンドを使用してから、使用しているCコンパイラでコンパイルします。

Cソースコードをコンパイルするときは、Pythonヘッダーを含むディレクトリを含め、システム上の対応するPython共有ライブラリにリンクする必要があります( Python 2.7)を使用している場合、_libpython27.so_または_libpython27.a_のような名前のファイル。

編集:ここでは、適切なヘッダーを含め、適切なライブラリにリンクするためのコマンドを取得する方法について、いくつかの詳細な説明を示します。

前に言ったように、次のようにCythonコンパイラーを実行する必要があります。

_cython <cython_file> --embed
_

Gccを使用してコンパイルするには、pythonヘッダーがシステムのどこにあるかを見つける必要があります(distutils.sysconfig.get_python_inc()を実行すると、この場所を取得できます(インポートする必要があります)まず、これはおそらく、Pythonインストールディレクトリの_/include_サブディレクトリです。

python共有ライブラリも見つける必要があります。Python 2.7の場合、Windowsでは_libpython27.a_、Linuxでは_libpython2.7.so_になります。 。

あなたのgccコマンドは

_gcc <C_file_from_cython> -I<include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>
_

_-fPIC_フラグを含めるのが賢明な場合があります。 Windows 64ビットマシンでは、64ビットウィンドウ用にコンパイルするようにmingwに指示するフラグ_-D MS_WIN64_も含める必要があります。

NumPyに依存するものをコンパイルする場合は、NumPyヘッダーを含むディレクトリも含める必要があります。 numpy.get_include()を実行すると、このフォルダーを見つけることができます(numpyをインポートした後)。次に、gccコマンドは次のようになります。

_gcc <C_file_from_cython> -I<include_directory> -I<numpy_include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>
_

このgccコマンドオプション guide が役立つ場合があります。

また、可能であればCythonのメモリビューを使用することをお勧めします。これで、NumPyヘッダーを含めたり、NumPy pxdファイルをCythonファイルに含めたりする必要がなくなります。また、Cコンパイラが最適化するスライス操作が容易になります。

32
IanH

Ubuntuでこれをテストしました:

以下を使用してCythonをインストールします(Python 2)。

Sudo apt-get install cython

Python 3の場合:

Sudo apt-get install cython3

PythonコードをCコードにコンパイルするには、次のように実行します(cythoncython3をPython 3に変更):

cython --embed -o example.c example.py

これにより、example.cファイルが生成されます。

example.cファイルをコンパイルします。

gcc -Os -I /usr/include/python2.7 example.c -lpython2.7 -o example

ファイルを実行します。

./example

Python 3の場合、次のようなものが機能します(テストされていません):

gcc -Os -I /usr/include/python3.6 example.c -lpython3.6 -o example

ここで、python3.xは、マシンにインストールされているPythonのバージョンです。

6
Rafael