2008-09-02 2 views
19

私は、時間のかかる計算のための事前計算値のbsddbデータベースを含むPythonパッケージを作成しました。簡単にするために、私のセットアップスクリプトは、データベースにアクセスするコードと同じディレクトリにデータベースファイルをインストールします(Unix上では、/usr/lib/python2.5/site-packages/mypackage/のようなものです)。Pythonモジュールディストリビューションでのファイルの検索

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

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

それは動作しますが、それは...ハックようです。これを行うより良い方法はありますか?私は、セットアップスクリプトをdistutilsモジュールから最終的なインストール場所を取得し、データベースにアクセスするコードの横にインストールされる "dbconfig.py"ファイルに入れておきたいと思います。

+0

Pythonでデータを配布することは常に苦痛です。私はあなたの質問に同意しますが、これ以上の解決策は見当たりません。 –

答えて

4

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

実際のセキュリティフレームワーク(UNIXなど)を使用するOSでは、スクリプトを実行しているユーザーが、インストールされているシステムディレクトリのDBにアクセスする権限がない可能性があるので注意してください。

23

は(私は今へのアクセス権を持っているニシキヘビのすべてに及び利用可能)setuptoolsのの一部であるpkg_resourcesを、使用してみてください:

>>> 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' 

eggsページ上のリソースを取得するためにpkg_resourcesの使用についてのより多くの議論がありますし、 pkg_resourcesページ

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

+1

これはあなたのパッケージを 'setuptools'に依存させます。これは標準ライブラリには存在しません。 –

+3

@techtonik悲しいことに、資源にアクセスする2つの標準的な方法は、disutilsまたはsetuptoolsを使用しています。標準ライブラリのみを使用してモジュール内のリソースにアクセスする方法はありません。これは、部分的には、外部ライブラリなしで広く配布可能なモジュールを構築することが難しいという事実のためです。 – theJollySin

+3

これは、setuptoolsがpart pipであり、最近のPythonがensure_pipを持っているので、今や正解です。 –

10

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

+0

pkgutilは常に利用可能であり、pkg_resourcesは$ PYTHON_EGG_CACHEディレクトリの圧縮された卵を展開するように見えるので、pkg_resourcesを使用することを強くお勧めします。 –