1. ホーム
  2. python

[解決済み] MANIFEST.in は "python setup.py install" で無視される - データファイルがインストールされていない?

2023-01-20 15:23:11

質問

これは、コード以外のものを削除した、私のstripped-down setup.pyスクリプトです。

#!/usr/bin/env python

from distutils.core import setup
from whyteboard.misc import meta


setup(
    name = 'Whyteboard',
    version = meta.version,

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
                'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],

    py_modules = ['whyteboard'],
    scripts = ['whyteboard.py'],
)

MANIFEST.in:

include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png

私が "python setup.py install sdist" を実行すると、私の locale/ images/ と whyteboard-help/ フォルダのある "whyteboard-0.41" ルートフォルダを含む素晴らしい .tar.gz が得られます。これはまた、whyteboard ソースパッケージの中から私のプログラムを起動する whyteboard.py スクリプトも持っています。

というわけで。

whyteboard/
 ├── locale/
 ├── images
 ├── whyteboard-help/
 ├── whyteboard/
 │  ├── __init__.py
 │  └── other packages etc
 ├── whyteboard.py
 ├── README
 ├── setup.py
 └── CHANGELOG

これは私のプログラムのソースを反映しており、すべてがあるべき姿であり、正しいものです。

しかし、私が "python setup.py install" を実行すると、私のデータファイルのどれも書き込まれません - "whyteboard" ソースパッケージのみ、そして whyteboard.py は /usr/local/lib/python2.6/dist-packages/ に配置されています。

理想的には、私のプログラムがそのリソースを探すことを期待する方法として、.tar.gz ファイルで生成されたものと同じディレクトリ構造が dist-packages で作成されることを望みます。

どうすれば "install" にこのディレクトリ構造を作成させることができますか。私が知る限りでは、マニフェスト ファイルを無視しているようです。

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

Nedの回答(核心的な問題を突いている)に加えて、いくつかの注意点があります。

Distutilsは、Pythonパッケージとモジュールを、プロジェクトごとのサブディレクトリ内の site-packages (または dist-packages に直接インストールされます。 site-packages に直接インストールされます。ですから whyteboard-xx ディレクトリは、最終的にインストールされた形では存在しません。

このことの意味するところは、あなたの data_files に直接インストールされるため、どのプロジェクトに属しているかを明確にするために、 という名前をつけることに注意しなければなりません。 site-packages ディレクトリに直接インストールされ whyteboard ディレクトリ内ではありません。

あるいは、代わりにデータを package_datawhyteboard パッケージの中 (つまり、そのパッケージの中、すなわち __init__.py の隣)、そしてこれは問題ではありません。

最後に、このような場合に、両方の whyteboard.py モジュールが py_moduleswhyteboard/__init__.py のパッケージで packages . この 2 つは互いに排他的で、両方がある場合は whyteboard.py モジュールはimportで無視され、同じ名前のパッケージが優先されます。

もし whyteboard.py が単なるスクリプトで、インポートされることを意図していない場合は スクリプト オプションを使用し、それを py_modules .