[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
質問
Pythonのパッケージを作りたいのですが、いくつかの Cython のコードを含む Python パッケージを作りたいと思います。Cythonのコードはうまく動作しています。しかし、今私はそれをパッケージ化する最良の方法を知りたいのです。
パッケージをインストールしたいだけの人のために、私は
.c
ファイルを作成し、Cython が作成する
setup.py
がそれをコンパイルしてモジュールを生成するように手配します。そうすれば、ユーザーはパッケージをインストールするために Cython をインストールする必要はありません。
しかし、パッケージを変更したい人のために、Cython の
.pyx
ファイルを提供し、さらにどうにかして
setup.py
を Cython を使ってビルドできるようにしました (そのため、これらのユーザは
は
は Cython をインストールする必要があります)。
これらのシナリオに対応するために、パッケージ内のファイルをどのように構成したらよいでしょうか。
このような場合
Cythonのドキュメントに少し指針があります
. しかし、それは単一の
setup.py
を作る方法は書かれていません。
どのように解決するのですか?
私自身は、Pythonのパッケージの中で
simplerandom
(
ビットバケツレポ
- 編集:現在
ギズブ
になりました)(これが人気のあるパッケージになるとは思っていませんが、Cythonを学ぶ良い機会でした)。
このメソッドは
.pyx
ファイルを
Cython.Distutils.build_ext
(は、(少なくともCythonバージョン0.14では)常に
.c
ファイルを作成します。
.pyx
ファイルを作成します。
以下は、切り出した
setup.py
を切り出したもので、要点を示していると思います。
from distutils.core import setup
from distutils.extension import Extension
try:
from Cython.Distutils import build_ext
except ImportError:
use_cython = False
else:
use_cython = True
cmdclass = {}
ext_modules = []
if use_cython:
ext_modules += [
Extension("mypackage.mycythonmodule", ["cython/mycythonmodule.pyx"]),
]
cmdclass.update({'build_ext': build_ext})
else:
ext_modules += [
Extension("mypackage.mycythonmodule", ["cython/mycythonmodule.c"]),
]
setup(
name='mypackage',
...
cmdclass=cmdclass,
ext_modules=ext_modules,
...
)
また
MANIFEST.in
を確実にするために
mycythonmodule.c
が含まれていることを確認します (ソースディストリビューションは
python setup.py sdist
):
...
recursive-include cython *
...
コミットしない
mycythonmodule.c
をバージョンコントロールの 'trunk' (Mercurial では 'default') にコミットしていません。リリースを作成するときは、忘れずに
python setup.py build_ext
を行う必要があります。
mycythonmodule.c
が存在し、ソースコード配布のために最新であることを確認します。また、リリース用のブランチを作成し、そのブランチにCファイルをコミットします。そうすることで、そのリリースで配布された C ファイルの歴史的な記録を得ることができます。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonとpip、利用可能なパッケージのすべてのバージョンをリストアップ?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] [Solved] .whlファイル付きのPythonパッケージをインストールする方法は?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] テンプレートファイル変更時にFlaskアプリを再読み込みする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] ネストしたdictからのPythonデータクラス
-
[解決済み] IPythonの終了確認を無効にする