web-dev-qa-db-ja.com

Python Packageサブディレクトリのデータにアクセス

python ./data/サブディレクトリのデータファイルを開く必要があるモジュールを含むパッケージを作成しています。現在、クラスと関数にハードコードされたファイルへのパスがあります。サブシステムがユーザーのシステムのどこにインストールされているかに関係なく、サブディレクトリにアクセスできる、より堅牢なコードを作成したい。

さまざまな方法を試しましたが、これまでのところ運がありません。ほとんどの「現在のディレクトリ」コマンドは、モジュールのディレクトリではなく、システムのpythonインタプリタのディレクトリを返します。

これは、些細な共通の問題であるはずです。しかし、私はそれを理解することができないようです。問題の一部は、データファイルが.pyファイルではないため、インポート関数などを使用できないことです。

助言がありますか?

現在、私のパッケージディレクトリは次のようになっています。

/
__init__.py
module1.py
module2.py
data/   
   data.txt

data.txtからmodule*.pyにアクセスしようとしています

ありがとう!

107
Jacob Lyles

次のように、__file__を使用してパッケージへのパスを取得できます。

import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()
24
RichieHindle

これを行う標準的な方法は、setuptoolsパッケージとpkg_resourcesを使用することです。

このリンクに従って、次の階層に従ってパッケージをレイアウトし、データリソースを指すようにパッケージセットアップファイルを構成できます。

http://docs.python.org/distutils/setupscript.html#installing-package-data

次のリンクのように、pkg_resourcesを使用してこれらのファイルを再検索して使用できます。

http://peak.telecommunity.com/DevCenter/PkgResources#basic-resource-access

import pkg_resources

DATA_PATH = pkg_resources.resource_filename('<package name>', 'data/')
DB_FILE = pkg_resources.resource_filename('<package name>', 'data/sqlite.db')
144
elliot42

今日機能するソリューションを提供する。このAPIを使用して、これらすべての車輪を再発明しないでください。

真のファイルシステムのファイル名が必要です。圧縮された卵はキャッシュディレクトリに抽出されます。

from pkg_resources import resource_filename, Requirement

path_to_vik_logo = resource_filename(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")

指定されたリソースの読み取り可能なファイルのようなオブジェクトを返します。実際のファイル、StringIO、または同様のオブジェクトの可能性があります。ストリームは「バイナリモード」にあります。つまり、リソース内のバイトがそのまま読み取られるという意味です。

from pkg_resources import resource_stream, Requirement

vik_logo_as_stream = resource_stream(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")

Pkg_resourcesを使用したパッケージ検出とリソースアクセス

13

答えを見つけたと思います。

モジュールdata_path.pyを作成し、それを含む他のモジュールにインポートします:

data_path = os.path.join(os.path.dirname(__file__),'data')

そして、私はすべてのファイルを

open(os.path.join(data_path,'filename'), <param>)
8
Jacob Lyles

モジュール全体の名前が必要です。ディレクトリツリーにはその詳細がリストされていないため、これは機能します。

import pkg_resources
print(    
    pkg_resources.resource_filename(__name__, 'data/data.txt')
)

特に、setuptoolsは、パックされたデータファイルとの名前の一致に基づいてファイルを解決するようには見えないので、data/プレフィックスを含める必要があります。別のディレクトリ区切り文字が必要な場合は、os.path.join('data', 'data.txt)を使用できます。一般的に、ハードコードされたUNIXスタイルのディレクトリ区切り文字との互換性の問題はありません。

7
ThorSummoner