読者です 読者をやめる 読者になる 読者になる

cocuh's note

type(あうとぷっと) -> 駄文

pythonでライブラリに依存してるC拡張をうまく入れるのどうすればいいのか(疑問)

疑問なので答えが出てません。(googleから来た人すいません)

背景

Cythonで音楽ファイルのデコーダを書こうと考えました。

もしoggとmp3とflacに対応させるとしたとき何も考えずに下みたいに書いたら、 libvorbisLAME(もしくは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

「じゃあ依存ライブラリごとにモジュールわければいいじゃん」と考えました たとえば、共有の部分のpyacodecpyacodec_oggpyacodec_mp3pyacodec_flacみたいにすれば、あとでflacつかおう」となっても再インストールも必要ありません(普通のpip installになるので)、

が、たくさんのモジュールに分かれるので管理がめんどくさいです。pypiもたくさんつかいます。
たぶんこの方法がいちばんスマートなのでしょうが、本当にこれでいいのかという感じもあります。

ぐぬぬ。。。

情報頼む!

「私はこうしてるよ」「このライブラリはこうしてるよ!」みたいな情報をお持ちの方はぜひぜひコメントリプライ(@cocu_628496)までしていただければよろこびます。