web-dev-qa-db-ja.com

「python setup.py install」でMANIFEST.inが無視されます-データファイルがインストールされていませんか?

以下は、コード以外のものを削除した、削除された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」を実行すると、「whyteboard-0.41」ルートフォルダーと、locale/images /およびwhyteboard-help /フォルダーが含まれたNice .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に作成したいと思います。これは私のプログラムがリソースを探すことを期待する方法です。

このディレクトリ構造を作成するために「インストール」を取得するにはどうすればよいですか?私の知る限り、マニフェストファイルを無視しているようです。

72
Steven Sproat

MANIFEST.inは、Distutilsにソースディストリビューションに含めるファイルを指示しますが、インストールされるファイルに直接影響しません。そのためには、適切なファイルをsetup.pyファイルに含める必要があります。通常は パッケージデータ または 追加ファイル のいずれかです。

55
Ned Deily

なぜMANIFEST.inを実行したときにファイルが無視されていたpython setup.py install-include_package_data=Trueは問題を解決します。 package_dataオプションは実際には必要ありません。

22
Greg

python 2.6.1をMac OSXで実行すると、setup.pyでdata_filesパラメーターを使用する以外、運がまったくありませんでした。MANIFEST.inのすべてが単純にファイルになりました他のいくつかのパッケージをチェックしたところ、実際に追加のファイルを指定するためにdata_filesを使用していました。

のディレクトリツリーからすべてのファイルを列挙するのに役立つ短い関数を作成しました

(target_dir、[file list]) data_filesが期待する形式:

def gen_data_files(*dirs):
    results = []

    for src_dir in dirs:
        for root,dirs,files in os.walk(src_dir):
            results.append((root, map(lambda f:root + "/" + f, files)))
    return results

これで、セットアップコール内でこれを呼び出すことができます。

setup(... data_files = gen_data_files("docs", "lib") ...

そして、それらのツリーのすべてがインストールされます。

8
Scott Persinger

Setuptoolsを使用する必要があります。

#!/usr/bin/env python

from setuptools import setup, find_packages
from whyteboard.misc import meta


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

  packages = find_packages(),
  include_package_data=True,

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

これは実際にMANIFESTファイルを使用してジョブを実行しているわけではありませんが、必要なすべてのファイルが含まれています。

7
Juho Rutila