1. ホーム
  2. python

[解決済み] ホイールにファイルを追加する方法を教えてください。

2023-04-13 22:05:23

質問

ホイールに含まれるファイルをどのように制御するのですか。 それは MANIFEST.in は使われないようです。 python setup.py bdist_wheel .

アップデイト :

ソースtarballからインストールする場合とwheelからインストールする場合の違いについて、私は勘違いしていました。 ソース配布物には MANIFEST.in で指定されたファイルを含みますが、インストールされたパッケージには python ファイルしかありません。 インストールがソースディストリビューション、egg、wheelのいずれであっても、インストールすべき追加のファイルを特定するための手順が必要です。 すなわち パッケージ_データ は追加のパッケージファイルに対して必要であり データファイル は、コマンドラインスクリプトやシステム設定ファイルのようなパッケージ外のファイルに対して必要です。

オリジナルの質問

私は プロジェクト を使用しています。 python setup.py sdist を使ってパッケージをビルドしています。 MANIFEST.in で含まれるファイルや除外されるファイルを制御し パイロマ チェック・マニフェスト を実行して、設定を確認します。

最近、Python 2 / 3 のデュアルコードに変換し、setup.cfg に

[bdist_wheel]
universal = 1

で車輪を作ることができる。 python setup.py bdist_wheel でホイールを構築することができ、希望通りのユニバーサルホイールに見えます。 しかし、それは MANIFEST.in .

何がインストールされるの?

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

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

  • multigtfs-0.4.2.tar.gz - にあるすべてのファイルを含むソース tar ball です。 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 ball からインストールした場合、フォルダ 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も)がフォルダにインストールされ、テストが正しく実行されるようになりました。 提案に感謝します!

どのように解決するのですか?

あなたは package_data の中で setup.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.
    include_package_data=True,
    package_data={
        'sample': ['package_data.dat'],
    },
    ...
)

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

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