97 votes

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

Voici mon setup.py script dépouillé avec les trucs non codés enlevé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

Quand je lance "python setup.py install sdist", j'obtiens un joli .tar.gz avec un dossier racine "whyteboard-0.41", avec mes dossiers locale/ images/ et whyteboard-help/. Il contient également mon script whyteboard.py qui lance mon programme depuis le paquet source de whyteboard.

Así que:

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, c'est comme ça que tout devrait être, et c'est correct.

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

Idéalement, j'aimerais que la même structure de répertoire que celle qui a été générée 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 faire en sorte que "install" crée cette structure de répertoire ? Il semble ignorer mon fichier manifeste, pour autant que je puisse dire.

0 votes

71voto

Ned Deily Points 40248

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

0 votes

J'ai essayé d'ajouter une liste de données de paquet mais aucun des fichiers que j'ai spécifiés n'a été utilisé. Je n'étais pas sûr que les emplacements des fichiers étaient installés par rapport à l'installation globale du paquet. Quoi qu'il en soit, il n'écrivait toujours pas mes fichiers dans la structure de répertoire correcte que j'attendais.

0 votes

La documentation dont le lien figure dans cette réponse vous donne toutes les informations nécessaires sur l'endroit où sont installés data_files et package_data. Si ces options ne fonctionnent pas pour vous, veuillez mettre à jour votre question en indiquant la syntaxe exacte que vous avez essayée, les résultats et ce que vous attendiez.

4 votes

Cela fonctionne pour moi : En dupliquant mes entrées MANIFEST.in dans les data_packages de setup.py, tout fonctionne. Merci Ned - Je n'ai pas compris ce point pendant des années. J'espère que maintenant mes expériences avec distutils/setuptools/distribute auront plus de sens.

36voto

Greg Points 3197

Je n'arrivais pas à comprendre pourquoi mon MANIFEST.in a été ignoré lorsque j'ai exécuté python setup.py install - il s'avère que include_package_data=True résout le problème. Le site package_data n'est pas vraiment nécessaire.

30voto

Carl Meyer Points 30736

Quelques remarques en complément de la réponse de Ned (qui touche au cœur du problème) :

Distutils n'installe pas les paquets et modules Python à l'intérieur d'un sous-répertoire par projet à l'intérieur de site-packages (ou dist-packages sur Debian/Ubuntu) : ils sont installés directement dans site-packages comme vous l'avez vu. Donc le contenant whyteboard-xx dans votre sdist n'existera pas dans la forme finale installée.

Cela implique que vous devez faire attention à nommer vos noms d'utilisateurs. data_files d'une manière qui clarifie à quel projet ils appartiennent, car ces fichiers/répertoires sont installés directement dans le fichier global site-packages et non dans un répertoire contenant whyteboard répertoire.

Ou vous pouvez plutôt faire en sorte que vos données package_data de la whyteboard (ce qui signifie qu'il doit vivre à l'intérieur de ce paquet, c'est-à-dire à côté de __init__.py ), et alors ce n'est pas un problème.

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

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

1 votes

C'est malheureux. Je n'aime pas l'idée d'avoir des données de paquetage - pour moi, il est plus logique que ces ressources se trouvent en dehors du répertoire source. Je n'aime pas non plus devoir faire précéder les noms de répertoire du nom du programme (même si je le fais déjà pour les fichiers d'aide). Hmm

9voto

Juho Rutila Points 310

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

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

0 votes

Cela a fonctionné pour moi avec setuptools . Je construis le paquet Debian et je vois mes fichiers glade listés dans package_data n'apparaissent au bon endroit qu'après que j'ai ajouté include_package_data=Tru .

8voto

Scott Persinger Points 1654

En utilisant python 2.6.1 sur Mac OSX, je n'ai eu absolument aucune chance, sauf en utilisant la commande fichiers de données dans setup.py. Tout ce qui est fait avec MANIFEST.in aboutit simplement à ce que les fichiers soient inclus dans le paquetage dist, mais ne soient jamais installés. J'ai vérifié d'autres paquets et ils utilisaient effectivement data_files pour spécifier des fichiers supplémentaires.

J'ai créé une courte fonction qui permet d'énumérer tous les fichiers d'une arborescence de répertoires dans l'application

(répertoire cible, [liste de fichiers]) que data_files attend :

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

Maintenant je peux juste appeler ça dans mon appel de configuration :

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

Et tout ce qui se trouve dans ces arbres est installé.

11 votes

C'est génial, mais où est-ce qu'on l'installe ? Pour moi, lorsque j'utilise "pip install", mes fichiers de données vont dans le Root de mon virtualenv (c'est-à-dire un répertoire unique partagé par tous les paquets du virtualenv.) Si j'utilise "setup.py install", alors mes fichiers de données vont dans "site-packages/<mypackage>.egg/". Si les fichiers sont des données nécessaires à l'exécution, alors dans aucun des cas il n'est trivial pour mon code de trouver ces fichiers, et bien sûr je dois chercher dans les deux répertoires à l'exécution. Si les fichiers sont mon fichier de LICENCE, alors dans aucun des cas il n'est trivial pour mes utilisateurs d'aller de ma source à la LICENCE. Je suis perplexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X