web-dev-qa-db-ja.com

setuptools / distributeにパッケージデータを含める方法

Setuptools/distributeを使用する場合、インストーラーに package_data ファイルを取り込むことができません。私が読んだことはすべて、次のことが正しい方法であると言っています。誰かアドバイスをお願いできますか?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   Zip_safe=False,
   install_requires=['distribute'],
)

ここで、myapp/data/はデータファイルの場所です。

110
cmcginty

私はこれが古い質問であることを理解しています...しかし、Googleを介してここにある方法を見つける人々のために:package_dataはローダウン、 汚い嘘 です。 binaryパッケージ(python setup.py bdist ...)をビルドする場合にのみ使用されますが、notの場合ソースパッケージのビルド(python setup.py sdist ...)。もちろん、これはばかげています-ソースディストリビューションを構築すると、バイナリディストリビューションを構築するために他の誰かに送信される可能性のあるファイルのコレクションが生成されることが予想されます。

いずれにせよ、 MANIFEST.in を使用すると、バイナリおよびソース配布でbothが機能します。

240
larsks

これと同じ問題がありました。解決策は、単にinclude_package_data=Trueを削除することでした。

ここを読んで の後、include_package_dataversion controlからのファイルを含むことを目的としていることを認識しました。ドキュメントから:

[include_package_data]のデータファイルは、CVSまたはSubversionの制御下にある必要があります

...

含まれるファイルをきめ細かく制御する場合(たとえば、パッケージディレクトリにドキュメントファイルがあり、インストールから除外する場合)、package_dataキーワードを使用することもできます。

この引数を取り除いて修正したのは、それがdistutilsに切り替えたときにも機能した理由です。

29
Joe

include_package_data=True行を削除するという@Joeの推奨事項にも従いました。

もう少し詳しく述べると、noMANIFEST.inファイルがあります。私はCVSではなくGitを使用しています。

リポジトリは次のような形を取ります。

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            Word_set.txt

setup.py

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'Word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

ソースdistribに対してpython setup.py sdistを実行します(バイナリを試していません)。

そして、まったく新しい仮想環境内にいるとき、私はmyproject-4.19.tar.gz、ファイルを持っているので、

(venv) pip install ~/myproject-4.19.tar.gz
...

そして、私の仮想環境のsite-packagesにインストールされるすべてのもの以外に、それらの特別なデータファイルは/opt/local/myproject/data/opt/local/myproject/etcにインストールされます。

17
HeyWatchThis

include_package_data=Trueは私のために働いた。

Gitを使用する場合は、setuptools-gitinstall_requiresを含めることを忘れないでください。 Manifestを持つことやpackage_dataにすべてのパスを含めることより退屈ではありません(私の場合は、すべての種類の静的なDjangoアプリです)

k3-rnc が実際に役立っていると述べたように、私が作成したコメントを貼り付けました)

11
vincent

Update:この回答は古く、情報は無効になっています。すべてのsetup.py構成では、import setuptoolsを使用する必要があります。 https://stackoverflow.com/a/49501350/6431 でより完全な回答を追加しました


Distutilsに切り替えることでこれを解決しました。配布は非推奨または壊れているようです。

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)
4
cmcginty

古代の質問とそれでも... pythonのパッケージ管理には本当に多くのことが望まれます。そのため、指定したディレクトリにローカルでpipを使用してインストールするユースケースがあり、package_dataとdata_filesの両方のパスが機能しなかったことに驚きました。リポジトリにさらに別のファイルを追加することに熱心ではなかったため、data_filesとsetup.pyオプション--install-dataを利用することになりました。このようなもの

pip install . --install-option="--install-data=$PWD/package" -t package  
4
Mat Baker

私はこの数日同じ問題を抱えていましたが、このスレッドでさえ明確にすることができませんでした。すべてが混乱しているだけです。だから私は私の研究を行い、解決策を見つけました。基本的にこの場合、これはあなたがすべきことです:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

他の完全なスタックオーバーフローの答えはこちら

1
ttbsttsoo

パッケージデータを含むフォルダーをモジュールフォルダーに移動すると、問題が解決しました。

この質問を参照してください: MANIFEST.inは「python setup.py install」では無視されます-データファイルがインストールされていませんか?

1
exhuma