32

より時間のかかる計算の 1 つについて、事前に計算された値の bsddb データベースを含む Python パッケージを作成しました。簡単にするために、セットアップ スクリプトは、データベースにアクセスするコードと同じディレクトリにデータベース ファイルをインストールします (Unix では、/usr/lib/python2.5/site-packages/mypackage/ など)。

コードがアクセスできるように、データベース ファイルの最終的な場所を保存するにはどうすればよいですか? __file__現在、データベースにアクセスするモジュールの変数に基づくハックを使用しています。

dbname = os.path.join(os.path.dirname(__file__), "database.dat")

動作しますが、どうやら... ハックっぽいです。これを行うより良い方法はありますか?セットアップ スクリプトで、distutils モジュールから最終的なインストール場所を取得し、データベースにアクセスするコードと一緒にインストールされる "dbconfig.py" ファイルに詰め込みます。

4

4 に答える 4

37

setuptools の一部である pkg_resources を使用してみてください (現在アクセスできるすべての python で利用可能です)。

>>> import pkg_resources
>>> pkg_resources.resource_filename(__name__, "foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile', "foo.config")
'/usr/lib/python2.4/foo.config'

ページとpkg_resourcesページでリソースを取得するために pkg_resources を使用することについて、さらに議論があります。

また、可能であれば、pkg_resources.resource_stream または pkg_resources.resource_string を使用することをお勧めします。これは、パッケージが卵の一部である場合、resource_filename がファイルを一時ディレクトリにコピーするためです。

于 2008-09-02T14:26:07.033 に答える
19

を使用しpkgutil.get_dataます。これは のいとこですpkg_resources.resource_streamが、標準ライブラリに含まれており、フラットなファイルシステムのインストールだけでなく、圧縮されたパッケージやその他のインポーターでも動作するはずです。

于 2012-03-29T02:52:42.973 に答える
3

これはおそらく、setuptoolsを使用してファイルが属する場所にインストールするなど、より高度な方法に頼ることなく、それを行う方法です。

実際のセキュリティフレームワークを備えたOS(UNIXなど)では、スクリプトを実行しているユーザーが、スクリプトがインストールされているシステムディレクトリ内のDBにアクセスする権限を持っていない可能性があるため、このアプローチには問題があることに注意してください。

于 2008-09-02T11:43:45.550 に答える