17

パッケージのディレクトリに対してファイルを参照するにはどうすればよいですか?

私のディレクトリ構造は次のとおりです。

    / foo
     package1 /
      資力/
      __init__。py
     package2 /
      資力/
      __init__。py
     script.py

script.pypackage1パッケージとをインポートしますpackage2。パッケージは、システム上の他のスクリプトでインポートできますが。たとえば、恣意的なpackage1場合に確実に機能するように、内部のリソースをどのように参照する必要がありますか?os.path.curdir

4

4 に答える 4

20

foo/package1/resourcesフォルダからファイルを参照する場合__file__は、モジュールの変数を使用します。内部foo/package1/__init__.py

from os import path
resources_dir = path.join(path.dirname(__file__), 'resources')
于 2009-06-18T08:00:44.020 に答える
9

これを行う簡単で安全な方法は、 pkg_resources ( setuptoolsで配布されている) のresource_filenameメソッドを次のように使用することです。

from pkg_resources import resource_filename
filepath = resource_filename('package1', 'resources/thefile')

または、これを内部で実装している場合package1/___init___.py:

from pkg_resources import resource_filename
filepath = resource_filename(__name__, 'resources/thefile')

これにより、(私が間違っていなければ)zipセーフでもあるクリーンなソリューションが得られます。

于 2016-10-05T02:01:22.697 に答える
4

twisted.python.modulesを使用すれば、zip セーフであると同時に便利な API を使用できます。

たとえば、data.txtテキストを含む があり、これsample.pyが 1 つのディレクトリにある場合:

from twisted.python.modules import getModule
moduleDirectory = getModule(__name__).filePath.parent()
print repr(moduleDirectory.child("data.txt").open().read())

インポートsampleすると次のようになります。

>>> import sample
'Hello, data!\n'
>>>

モジュールが通常のディレクトリにある場合はgetModule(__name__).filePathFilePathになります。zip ファイルの場合は、同じ API のすべてではありませんがほとんどをサポートするZipPathになります。

于 2009-06-18T08:33:57.293 に答える
-1

パッケージが圧縮された卵としてインストールされた場合、リソースが利用できない可能性があるため、これは悪い考えです。

setuptool を使用する場合は、zip_safe=False を setup.py 構成に追加することを忘れないでください。

于 2009-06-18T08:20:28.723 に答える