web-dev-qa-db-fra.com

MANIFEST.in ignoré sur "python setup.py install" - aucun fichier de données installé?

Voici mon script setup.py dépouillé avec des éléments non codés supprimés:

#!/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

Lorsque j'exécute "python setup.py install sdist", j'obtiens un Nice .tar.gz avec un dossier racine "whyteboard-0.41", avec mes paramètres régionaux/images/et whyteboard-help/dossiers à l'intérieur. Cela a également mon script whyteboard.py qui lance mon programme à partir du package source whyteboard.

Donc:

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

Cela reflète la source de mon programme, comment tout devrait être et est correct.

Cependant, lorsque j'exécute "python setup.py install", aucun de mes fichiers de données n'est écrit - seul le paquet source "whyteboard" et le whyteboard.py sont placés dans /usr/local/lib/python2.6/dist-packages/ .

Idéalement, j'aimerais que la même structure de répertoires que ce qui a été généré dans le fichier .tar.gz soit créée dans dist-packages, car c'est ainsi que mon programme s'attend à rechercher ses ressources.

Comment puis-je obtenir "installer" pour créer cette structure de répertoires? Il semble ignorer mon fichier manifeste, pour autant que je sache.

72
Steven Sproat

Quelques notes en plus de la réponse de Ned (qui touche au problème principal):

Distutils n'installe pas Python dans un sous-répertoire par projet dans site-packages (Ou dist-packages Sur Debian/Ubuntu): ils sont installés directement dans site-packages, Comme vous l'avez vu. Ainsi, le répertoire contenant whyteboard-xx Dans votre sdist n'existera pas sous la forme finale installée.

Cela implique que vous devez faire attention à nommer votre data_files De manière à clarifier à quel projet il appartient, car ces fichiers/répertoires sont installés directement dans le répertoire global site-packages, Pas dans tout répertoire contenant whyteboard.

Ou vous pouvez plutôt créer vos données package_data Du package whyteboard (ce qui signifie qu'il doit vivre à l'intérieur de ce package, c'est-à-dire à côté de __init__.py), Et ce n'est pas le cas un problème.

Enfin, cela n'a pas beaucoup de sens d'avoir à la fois un module whyteboard.py Dans py_modules Et un package whyteboard/__init__.py Dans packages. Les deux s'excluent mutuellement, et si vous avez les deux, le module whyteboard.py Sera ignoré par les importations en faveur du package du même nom.

Si whyteboard.py N'est qu'un script et n'est pas destiné à être importé, vous devez alors utiliser l'option scripts et le supprimer de py_modules.

25
Carl Meyer

MANIFEST.in indique à Distutils les fichiers à inclure dans la distribution source mais cela n'affecte pas directement les fichiers installés. Pour cela, vous devez inclure les fichiers appropriés dans le setup.py fichier, généralement sous la forme données de package ou fichiers supplémentaires .

55
Ned Deily

Je n'ai pas pu comprendre pourquoi mon fichier MANIFEST.in Était ignoré lorsque j'ai exécuté python setup.py install - il s'avère que include_package_data=True Résout le problème. L'option package_data N'est pas réellement requise.

22
Greg

Vous devez utiliser 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'],
)

Ce n'est pas réellement utiliser le fichier MANIFEST pour faire le travail, mais il inclut tous les fichiers nécessaires.

7
Juho Rutila