確かに!
(以下では、私はあなたがすでにcimport
と.pxd
と.pyx
の間の相互作用に対処する方法を知っていることを前提としています。これは完全に当てはまらない場合は、ちょうど尋ねると、私もその部分を開発します)
サンプル(私のC++プロジェクトからつかんだが、Cのプロジェクトはほとんど同じ動作します):
1. Distutilsのセットアップファイル:作成する拡張機能をbになると仮定すると
:あなた外部
.so
ファイル
libraries
オプションを介して連結されている:注は
# setup.py file
import sys
import os
import shutil
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
# clean previous build
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if (name.startswith("myext") and not(name.endswith(".pyx") or name.endswith(".pxd"))):
os.remove(os.path.join(root, name))
for name in dirs:
if (name == "build"):
shutil.rmtree(name)
# build "myext.so" python extension to be added to "PYTHONPATH" afterwards...
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [
Extension("myext",
sources=["myext.pyx",
"SomeAdditionalCppClass1.cpp",
"SomeAdditionalCppClass2.cpp"
],
libraries=["externlib"], # refers to "libexternlib.so"
language="c++", # remove this if C and not C++
extra_compile_args=["-fopenmp", "-O3"],
extra_link_args=["-DSOME_DEFINE_OPT",
"-L./some/extra/dependency/dir/"]
)
]
)
...(ここで、*プレフィックスをLIBに注意してください)eはmyext
と呼ばれ、サードパーティの共有ライブラリがlibexternlib.so
です
libraries=["externlib"] # Without the 'lib' prefix and the '.so' extension...
注:sources
オプションを使用して、追加のソースファイルをコンパイルすることができます。
重要:myext.pxd
(.pyd
と混同していない - Windowsのものを)とmyext.pyx
は同じディレクトリにある必要があります。コンパイル時に、定義ファイルが存在する場合、最初に処理されます(more)。
2。次のようにそれを実行します。あなたのmyext.pxd
、あなたのmyext.pyx
、並びに上のsetup.py
スクリプトを含む1にディレクトリを変更した後
を:
# setup.sh
# Make the "myext" Python Module ("myext.so")
CC="gcc" \
CXX="g++" \
CFLAGS="-I./some/path/to/includes/ -I../../../DEPENDENCIES/python2.7/inc -I../../../DEPENDENCIES/gsl-1.15" \
LDFLAGS="-L./some/path/to/externlib/" \
python setup.py build_ext --inplace
どこ:
libexternlib.so
があります./some/path/to/externlib/
yourheader.h
に位置するものとする。
注:CFLAGS
もextra_compile_args
オプションを使用して設定されている可能性が:
extra_compile_args=["-I./some/path/to/includes/", "-fopenmp", "-O3"]
注:LDFLAGS
もextra_link_args
オプションを使用して設定されている可能性が:
extra_link_args=["-L./some/path/to/externlib/", "-DSOME_DEFINE_OPT", "-L./some/extra/dependency/dir/"]
ビルドでdistutilsを実行すると、新しいファイル、特にmyext.cpp
,myext.h
があり、最も重要なのはmyext.so
です。その後
3.、あなたが行ってもいいです:あなたのたて作成したPythonの拡張は、その名前でインポートすることができます
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./some/path/to/externlib/
export PYTHONPATH=$PYTHONPATH:./some/path/to/myext/
# Run some script requiring "myext.so"
python somescript.py
:
# somescript.py
import myext
from myext import PySomeFeature
...
注の最適化について:デフォルトでは、拡張子のコンパイルには-O2
が使用されていますが、これはオーバーロードする可能性があります(上の設定を参照してください。-O3
が指定されています)。 Cythonパスに関する
注:Cythonは、カスタムディレクトリにインストールした場合、あなたが前にすべて、ご使用の環境に追加する場合があります
PYTHONPATH=$PYTHONPATH:../../../DEPENDENCIES/Cython-0.18 export PYTHONPATH;
PATH=$PATH:../../../DEPENDENCIES/Cython-0.18/bin; export PATH;
まあ、私は要点をカバー願っています。..
お世話になりました。私は次のエラーが表示されます:ld:ライブラリが見つからない-lMYLIB MYLIB.soがリンクしようとしているファイルです - 任意のアイデアですか? – josephmisiti
これを忘れてしまいました。gcc -lコマンドはあなたの* .soがlibで始まると仮定しているので、これを削除して見つけたので、動作しているようです。 – josephmisiti
それを聞いてうれしい。乾杯;-) –