web-dev-qa-db-ja.com

ホイールにファイルを追加するにはどうすればよいですか?

ホイールに含まれるファイルをどのように制御しますか? _MANIFEST.in_は_python setup.py bdist_wheel_によって使用されていないようです。

[〜#〜] update [〜#〜]

ソースtarballからのインストールとホイールからのインストールの違いについては間違っていました。ソース配布には_MANIFEST.in_で指定されたファイルが含まれますが、インストールされたパッケージにはpythonファイルのみがあります。インストールがソース配布経由であるかどうかにかかわらず、インストールする追加フ​​ァイルを識別する手順が必要です、卵、またはホイール。つまり、追加のパッケージファイルには package_data が必要であり、コマンドラインスクリプトやシステム構成ファイルなどのパッケージ外のファイルには data_files が必要です。

元の質問

プロジェクト パッケージをビルドするために_python setup.py sdist_を使用している場所、含まれるファイルと除外するファイルを制御するために_MANIFEST.in_を使用する場所、および pyromacheck-manifest 設定を確認します。

私は最近それをデュアルPython 2/3コードに変換し、setup.cfgを追加しました

_[bdist_wheel]
universal = 1
_

_python setup.py bdist_wheel_を使用してホイールを作成できますが、必要に応じてユニバーサルホイールのように見えます。ただし、_MANIFEST.in_で指定されたすべてのファイルが含まれているわけではありません。

何がインストールされますか?

私はより深く掘り下げ、今ではパッケージングとホイールについてより多くを知っています。私が学んだことは次のとおりです。

2つのパッケージファイルを PyPiのmultigtfsプロジェクト にアップロードします。

  • _multigtfs-0.4.2.tar.gz_-_MANIFEST.in_内のすべてのファイルを含むソースtarボール。
  • _multigtfs-0.4.2-py2.py3-none-any.whl_-問題のバイナリ配布。

Python 2.7.5)で2つの新しい仮想環境を作成し、各パッケージ(_pip install multigtfs-0.4.2.tar.gz_)をインストールしました。2つの環境はほぼ同じです。異なる_.pyc_があります「コンパイルされた」ファイルPythonファイル。ディスク上のさまざまなパスを記録するログファイルがあります。ソースtarボールからのインストールには、フォルダー_multigtfs-0.4.2-py27.Egg-info_が含まれます。インストール、ホイールインストールには_multigtfs-0.4.2.dist-info_フォルダーがあり、そのプロセスの詳細が記載されていますが、multigtfsプロジェクトを使用するコードの観点からは、2つのインストール方法に違いはありません。

明示的に、どちらも私のテストで使用される.Zipファイルがないため、テストスイートは失敗します。

_$ Django-admin startproject demo
$ cd demo
$ pip install psycopg2  # DB driver for PostGIS project
$ createdb demo         # Create PostgreSQL database
$ psql -d demo -c "CREATE EXTENSION postgis" # Make it a PostGIS database 
$ vi demo/settings.py   # Add multigtfs to INSTALLED_APPS,
                        # Update DATABASE to set ENGINE to Django.contrib.gis.db.backends.postgis
                        # Update DATABASE to set NAME to test
$ ./manage.py test multigtfs.tests  # Run the tests
...
IOError: [Errno 2] No such file or directory: u'/Users/john/.virtualenvs/test/lib/python2.7/site-packages/multigtfs/tests/fixtures/test3.Zip'
_

追加ファイルを指定する

回答からの提案を使用して、いくつかの追加のディレクティブを_setup.py_に追加しました。

_from __future__ import unicode_literals
# setup.py now requires some funky binary strings
...
setup(
    name='multigtfs',
    packages=find_packages(),
    package_data={b'multigtfs': ['test/fixtures/*.Zip']},
    include_package_data=True,
    ...
)
_

これにより、Zipファイル(およびREADME)がフォルダーにインストールされ、テストが正しく実行されるようになります。提案をありがとう!

48
jwhitlock

package_datasetup.pyを使用してみましたか? MANIFEST.inはpythonバージョン<= 2.6をターゲットにしているようです。上位バージョンでもそれを見ているかどうかはわかりません。

https://github.com/pypa/sampleproject を探索した後、彼らのMANIFEST.inはこう言います:

# If using Python 2.6 or less, then have to include package data, even though
# it's already declared in setup.py
include sample/*.dat

この方法は時代遅れであると思われます。その間、setup.pyで宣言します:

setup(
    name='sample',
    ...
    # If there are data files included in your packages that need to be
    # installed, specify them here.  If using Python 2.6 or less, then these
    # have to be included in MANIFEST.in as well.
    package_data={
        'sample': ['package_data.dat'],
    },
    ...
)

MANIFEST.inでワイルドカードを選択し、setup.pyでファイル名を選択した理由はわかりません。同じファイルを参照しています)

これは、単純であることに加えて、package_dataルートがMANIFEST.inメソッドよりも優れていることを暗示しているようです。まあ、あなたが2.6をサポートする必要がない限り、その場合、私の祈りはあなたに行きます。

29
vgel

変更を行う前にMANIFEST.inまたはsetup.pyで、古い出力ディレクトリを削除する必要があります。 Setuptoolsは一部のデータをキャッシュしているため、予期しない結果が生じる可能性があります。

rm -rf build *.Egg-info

これを行わない場合、何も正しく動作しないことを期待してください。

今ではそれは邪魔です。

  1. ソース配布sdist)を構築している場合、以下の任意の方法を使用できます。

  2. wheelbdist_wheel)を構築している場合、include_package_dataMANIFEST.inは無視され、package_datadata_filesを使用する必要があります。

INCLUDE_PACKAGE_DATA

これは良いオプションですが、bdist_wheelはそれを尊重しません。

setup(
    ...
    include_package_data=True
)

# MANIFEST.in
include package/data.json

非パッケージデータのDATA_FILES

リポジトリの任意のファイルをsdistまたはbdist_wheelに追加できるため、これは最も柔軟なオプションです

setup(
    ....
    data_files=[
        ('output_dir',['conf/data.json']),
    ]
    # For sdist, output_dir is ignored!
    #
    # For bdist_wheel, data.json from conf dir in root of your repo 
    # and stored at `output_dir/` inside of the sdist package.
)

パッケージ内の非PythonファイルのPACKAGE_DATA

上記と似ていますが、bdist_wheelの場合は、パッケージ内にデータファイルを入れましょう。 sdistでも同じですが、ファイルはパッケージのサブディレクトリからしか取得できないため、data_filesよりも多くの制限があります。

setup(
    ...
    package_data={'package':'data.json'},
    # data.json must be inside of your actual package
)
16
cmcginty

_package_data_で_data_files_と_setup.py_を使用して追加のファイルを指定できますが、それらは 正しく取得するのはとてつもなく難しい(そしてバグがある) です。

別の方法としては、_MANIFEST.in_を使用し、_include_package_data=True_のsetup()に_setup.py_を ここに示す として追加することです。

このディレクティブでは、_MANIFEST.in_を使用して、ソースtarball/Zipだけでなく、wheelおよびwin32インストーラーにも含めるファイルを指定します。これは、任意のpythonバージョン(py2.6からpy3.6のプロジェクトでテスト済み)でも機能します。

12
gaborous

data_files ディレクティブを使用して、インストールする追加のファイルを指定できます。それはあなたが探しているものですか?以下に小さな例を示します。

from setuptools import setup
from glob import glob

setup(
    name='extra',
    version='0.0.1',
    py_modules=['extra'],
    data_files=[
        ('images', glob('assets/*.png')),
    ],
)
10
lazy1

JSONファイルを含むconfig /ディレクトリがあり、これをwheelパッケージに追加する必要がありました。そこで、これらの行をMANIFEST.inに追加しました。

recursive-include config/ *.json

setup.pyへの次のディレクティブ:

setup(
 ...
 include_package_data=True,
)

そして、何もうまくいきませんでした。 __init__.pyディレクトリ内にconfig/という空のファイルを作成するまで。

(Python 3.6.7、wheel 3.6.7、setuptools 39.0.1)

0
Michael Spector