28

これは、"setup.py" を使用してインストール パッケージをビルドした開発者にとって非常に一般的な質問であり、以前に尋ねられるべきものでしたが、どこにも適切な答えが見つかりませんでした。

setup.py で

from distutils.core import setup
setup(
    ....,
    ....,
    data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])],
    ....,
    ....,
    )

sudo python setup.py install の結果

running install
running build
running build_py
running build_scripts
running install_lib
running install_scripts
changing mode of /usr/local/bin/MyApp_trainer to 755
changing mode of /usr/local/bin/MyApp_reference_updater to 755
changing mode of /usr/local/bin/MyApp_predictor to 755
changing mode of /usr/local/bin/reference_updater to 755
running install_data
creating /usr/local/MyApp/CBV
copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV
copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info

上記の結果を使用した観察から、「/usr/local」は「data_files」ルート ディレクトリです。ハードコーディング以外に、この「data_files」ルート ディレクトリを提供できる Python 関数はありますか?

4

1 に答える 1

19

デフォルトでは、ルートとしてパッケージをインストールする場合、リスト内の相対ディレクトリ名は(pure-python ライブラリの場合) または(コンパイルされた拡張子を持つライブラリの場合)data_filesの値に対して解決されるため、それに基づいてファイルを取得できます。 . ドキュメントからの引用:sys.prefixsys.exec_prefixdistutils

ディレクトリが相対パスの場合、インストール プレフィックス (sys.prefix純粋な Python パッケージの場合は Python sys.exec_prefix、拡張モジュールを含むパッケージの場合) に対して相対的に解釈されます。

したがって、あなたの例では、ファイルはos.path.join(sys.prefix, 'MyApp', 'CBV').

importlib.resourcesただし、ライブラリ(Python 3.7 以降) を使用してパッケージ データを読み込む方がよいでしょう。最適に機能させるために、データ ファイルをパッケージに含める必要があります。つまり、MANIFEST.in ファイルと setにファイル パターンをリストするか、 にファイル パターンをリストするかのどちらかを使用するdata_files代わりに、setuptools ドキュメントの「データ ファイルを含める」を参照してください。include_package_data=Truepackage_data

以前のバージョンの Python では、pkg_resourcesモジュール Resource APIを使用して同じことを行い、データ ファイルを読み込むことができます (これはsetuptoolsまさにこの目的のためにライブラリの一部です)。

次に、そのようなリソース ファイルをパッケージから直接、次のように文字列に読み込むことができますresource_string()

try:
    from importlib.resources import read_text
except ImportError:
    from pkg_resources import resource_string as read_text

foo_config = read_text(__name__, 'foo.conf')
于 2013-01-08T09:14:34.827 に答える