120MB のデータ ファイルをロードする必要がある Python 用の C 拡張機能を作成してインストールしようとしています。distutilspackage_data
引数を使用して、拡張モジュールと同じフォルダーにデータ ファイルを正しくインストールしました。ただし、C コードはデータ ファイルを見つける方法を知りません。
インストールされたデータ ファイルへのパスを C 拡張子でハード コードすることはできますが (これは機能します)、インストール ディレクトリが異なるシステムでは明らかに機能しません。この拡張機能は、Linux と Windows の両方にインストールする必要があります。
モジュールへのパスを取得し、そこからデータファイルへのパスを作成するために使用しようとしましPyModule_GetFilename()
たが、その関数はSystemError: module filename missing
. おそらくエラーは、モジュールの init 関数内で呼び出そうとしているためですか?
必要に応じて、モジュールの初期化以外でデータ ファイルを手動で読み込むことができますが、インポート時にファイルを自動的に読み込む方がはるかに望ましいでしょう。
編集:だから、回避策を見つけました。ファイルのパスを引数として取ることができる初期化関数を書きました。Python からモジュールの__file__
属性にアクセスし、そこからデータ ファイルへのパスを特定できます。次に、で初期化関数を実行すると、すべてが機能し__init__.py
ます。これはうまくいきますが、誰かがもっとエレガントな解決策を教えてくれることを願っています。