pythonでライブラリに依存してるC拡張をうまく入れるのどうすればいいのか(疑問)
疑問なので答えが出てません。(googleから来た人すいません)
背景
Cythonで音楽ファイルのデコーダーを書こうと考えました。
もしoggとmp3とflacに対応させるとしたとき何も考えずに下みたいに書いたら、
libvorbis
とLAME
(もしくはMAD
)とFLAC
の3つのライブラリがすべてが入っていないとコンパイルできなくなります。
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext setup( cmdclass={'build_ext': build_ext}, ext_modules=[ Extension('pyacodec.vorbis', ['vorbis.pyx'], libraries=['vorbisfile']), Extension('pyacodec.mp3', ['mp3.pyx'], libraries=['lame']), Extension('pyacodec.flac', ['flac.pyx'], libraries=['FLAC']), ] )
oggデコーダーしたいだけなのにflacとかいれるのいやだ!となりますよね…
なにが気にくわないか
コンパイル時にライブラリが必要であるということ
(バイナリ配布という手もありますがあまりしたくないです…
案1
「じゃあ、ライブラリが足りなかったらコンパイルしなければいいじゃない」と考えました。が、
例えば、後になって「flacもいれたしライブラリ叩こう!」としたときに、再インストールが必要になります(コンパイルし直さないといけないので)。
pipで入れていた場合、pipはあまり再インストールすることを想定されていないので、
pip install spam --force-reinstall
としなければならずなにか気持ち悪いです。
案2
「じゃあ依存ライブラリごとにモジュールわければいいじゃん」と考えました
たとえば、共有の部分のpyacodec
とpyacodec_ogg
とpyacodec_mp3
とpyacodec_flac
みたいにすれば、あとで「flacつかおう」となっても再インストールも必要ありません(普通のpip install
になるので)、
が、たくさんのモジュールに分かれるので管理がめんどくさいです。pypiもたくさんつかいます。
たぶんこの方法がいちばんスマートなのでしょうが、本当にこれでいいのかという感じもあります。
ぐぬぬ。。。
情報頼む!
「私はこうしてるよ」や「このライブラリはこうしてるよ!」みたいな情報をお持ちの方はぜひぜひコメントかリプライ(@cocu_628496)までしていただければよろこびます。