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シェルでプログラムを実行できるが、コマンドラインでは実行できないという事実があるため、ここで接続が切断されています(ユーザーがシェル、インポートモジュールなど)。
ここで何が欠けていますか?
必要なのは、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コンパイラが最適化するスライス操作が容易になります。
Ubuntuでこれをテストしました:
以下を使用してCython
をインストールします(Python 2)。
Sudo apt-get install cython
Python 3の場合:
Sudo apt-get install cython3
PythonコードをCコードにコンパイルするには、次のように実行します(cython
をcython3
を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のバージョンです。