89

wheel に含まれるファイルを制御するにはどうすればよいですか? MANIFEST.inでは使用されていないようpython setup.py bdist_wheelです。

更新

ソース tarball と wheel からのインストールの違いについて、私は間違っていました。ソース配布には で指定されたファイルが含まれていますMANIFEST.inが、インストールされたパッケージには python ファイルしか含まれていません。インストールがソース配布、egg、またはホイールのいずれによるものであるかに関係なく、インストールする必要がある追加のファイルを特定するための手順が必要です。つまり、追加のパッケージ ファイルにはpackage_dataが必要であり、コマンド ライン スクリプトやシステム構成ファイルなどのパッケージ外のファイルにはdata_filesが必要です。

元の質問

パッケージをビルドし、含まれるファイルと除外されるファイルを制御し、設定を確認するためにpyromacheck-manifestを使用しているプロジェクトがありますpython setup.py sdistMANIFEST.in

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

[bdist_wheel]
universal = 1

でホイールを作成できpython setup.py bdist_wheelます。希望どおりのユニバーサル ホイールのように見えます。ただし、 で指定されたすべてのファイルが含まれているわけではありませんMANIFEST.in

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

深く掘り下げた結果、パッケージングとホイールについて詳しく知ることができました。これが私が学んだことです:

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

  • multigtfs-0.4.2.tar.gz- のすべてのファイルを含むソース tar ボールMANIFEST.in
  • 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) がフォルダーにインストールされ、テストが正しく実行されるようになります。提案をありがとう!

4

6 に答える 6

27

package_datadata_filesinを使用しsetup.pyて追加のファイルを指定することはできますが、正しく取得するのが途方もなく困難です (そしてバグがあります)

別の方法として、ここに示されているように を使用MANIFEST.inして追加include_package_data=Trueすることもできます。setup()setup.py

このディレクティブではMANIFEST.in、ソース tarball/zip だけでなく、wheel および win32 インストーラーにも含めるファイルを指定するために使用されます。これは、どのバージョンの Python でも機能します (py2.6 から py3.6 までのプロジェクトでテストしました)。

UPDATE 2020: MANIFEST.in は、Python 3 のホイールによって受け入れられなくなったようですが、設定しても tar.gz にはまだありますinclude_package_data=True

これを修正する方法は次のとおりです。 と の両方を指定する必要がありinclude_package_dataますpackages

Python モジュールがフォルダー "pymod" 内にある場合、適切なセットアップは次のとおりです。

setup( ...
    include_package_data = True,
    packages = ['pymod'],
)

Python スクリプトがルートにある場合は、次を使用します。

setup( ...
    include_package_data = True,
    packages = ['.'],
)

次に、7-zip などの zip アーカイブ ソフトウェアを使用して .whl ファイルを開き、必要なすべてのファイルが実際に含まれていることを確認します。

于 2016-10-03T01:53:59.607 に答える
11

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')),
    ],
)
于 2014-09-19T13:23:51.987 に答える
4

include_package_data行く方法であり、 sdistと wheelで機能します。

ただし、正しく行う必要があり、これを理解するのに数か月かかりました。これが私が学んだことです.

トリックは基本的にオプションの名前で与えられますinclude_PACKAGE_dataデータファイルはパッケージサブフォルダーにある必要があります

場合に限り

  • include_package_data真です
  • データファイルは次の場所にリストされていますMANIFEST.in(* については、最後のメモも参照してくださいsetuptools_scm)
  • データファイルはパッケージディレクトリの下にあります

その後、データファイルが含まれます。

作業例:

プロジェクトに次の構造とファイルがあるとします。

|- MANIFEST.in
|- setup.cfg
|- setup.py
|
\---foo
    |- __init__.py
    |
    \---data
         - example.png

そして、次の構成:

Manifest.in:

recursive-include foo/data *

setup.py

import setuptools

setuptools.setup()

setup.cfg

[metadata]
name = wheel-data-files-example
url = www.example.com
maintainer = None
maintainer_email = none@example.com

[options]
packages =
    foo
include_package_data = True

作成するsdist パッケージとホイールには、example.pngデータファイルも含まれます。

(もちろん、setup.cfg の代わりに、config を setup.py で直接指定することもできます。しかし、これはこの例には関係ありません。)

更新: src レイアウト プロジェクトの場合

これは、次のような src レイアウトを使用するプロジェクトでも機能するはずです。

|- MANIFEST.in
|- setup.cfg
|- setup.py
|
\---src
    |
    \---foo
        |- __init__.py
        |
        \---data
             - example.png

動作させるには、以下を使用して setuptools に src ディレクトリについて伝えますpackage_dir

setup.cfg

[metadata]
name = wheel-data-files-example
url = www.example.com
maintainer = None
maintainer_email = none@example.com

[options]
packages =
    foo
include_package_data = True
package_dir =
    =src

マニフェストでパスを調整します。

Manifest.in:

recursive-include src/foo/data *

注: 使用する場合は Manifest.in は必要ありませんsetuptools_scm

setuptools を使用して( pypi にsetuptools_scm)プラグインを追加する場合、Manifest.in ファイルを管理する必要はありません。代わりに、setuptools_scm は、git によって追跡されるすべてのファイルがパッケージに追加されるようにします。

したがって、この場合、ファイルが sdist/wheel に追加されるかどうかのルールは次のとおりです。

  • include_package_data真です
  • ファイルは git (または別の setuptools_scm サポート ツール) によって追跡されます。
  • データファイルはパッケージディレクトリの下にあります

その後、データファイルが含まれます。

于 2020-09-07T15:19:30.117 に答える