web-dev-qa-db-ja.com

フォルダーを作成せずに、単一の.pyファイルと単一のデータファイルをパッケージ化するためのsetup.pyのセットアップ

プロジェクトツリー:

$.
├── happy_birthday-art.txt
├── happy_birthday.py
├── MANIFEST.in
├── README.rst
└── setup.py

setup.py

from setuptools import setup

setup(
    name='Happy_birthday',
    py_modules=['happy_birthday'],
    data_files=['happy_birthday-art.txt'],
    entry_points={
    'console_scripts': ['happy_birthday = happy_birthday:main', ],},
    long_description=open('README.rst').read(),
)

仮想環境でpython setup.py sdistを実行してからpip install作成した.tar.gzファイルを実行すると、次のメッセージが表示されます。

warning: install_data: setup script did not provide a directory for 'happy-birthday-art.txt' -- installing right in '/home/username/.virtualenvs/happy_birthday'

プログラムはその.txtファイルを使用するため、後で実行しようとすると失敗します。

しかし、happy_birthday-art.txtを別のフォルダーにインストールしたくありません。 happy_birthday.pyがインストールされているフォルダにインストールしたいのですが。また、setup.pyで絶対パスを使用する必要はありません。 setup.pyファイルを最適に設定するにはどうすればよいですか?

36
Bentley4

このような単一ファイルモジュールがある場合、フォルダは作成されません。.pyファイルは、他のpythonモジュール(/usr/lib/pythonX.X/site-packages/、 例えば)。それがあなたがhaveディレクトリを作成する理由です:

$ .
|-- happy_birthday/
    |-- __init__.py
    |-- art.txt
|-- MANIFEST.in
|-- README.rst
|-- setup.py
22

http://docs.python.org/2/distutils/setupscript.html

「ターゲットディレクトリを指定せずに、data_filesオプションをファイルの単純なシーケンスとして指定できますが、これはお勧めしません。この場合、installコマンドは警告を出力します。データファイルをターゲットディレクトリに直接インストールするには、空の文字列ディレクトリとして指定する必要があります。」

ただし、ここでは、ターゲットディレクトリはsite-packagesフォルダーではなく、venvのルートであるプレフィックスフォルダーです。 .txtをsite-packagesdir bareに配置したい場合は、見た目が醜いだけでなく、実際にはサポートされていないように見えます。一方、環境内の別の場所、たとえば「share/doc/foo」にインストールすることは可能です。

data_files=[('share/doc/foo', ['happy_birthday-art.txt'])],
7
Antti Haapala