web-dev-qa-db-fra.com

Comment inclure les données de paquet avec setuptools/distribuer?

Lors de l'utilisation de setuptools/distribution, je ne peux pas demander au programme d'installation de récupérer les fichiers package_data . Tout ce que j'ai lu dit que ce qui suit est la bonne façon de le faire. Quelqu'un peut-il s'il vous plaît conseiller?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   Zip_safe=False,
   install_requires=['distribute'],
)

myapp/data/ est l'emplacement des fichiers de données.

103
cmcginty

Je me rends compte que c’est une vieille question ... mais pour les gens qui y trouvent leur chemin ici via Google: package_data est un faible, sale mensonge . Il n'est utilisé que lors de la construction des packages binary (python setup.py bdist ...), mais not lors de la construction des packages source (python setup.py sdist ...). Ceci est bien sûr ridicule - on pourrait s’attendre à ce que la création d’une distribution source aboutisse à un ensemble de fichiers pouvant être envoyés à une autre personne pour créer la distribution binaire.

Dans tous les cas, utiliser MANIFEST.in fonctionnera les deux pour les distributions binaires et sources.

220
larsks

Je viens d'avoir ce même problème. La solution consistait simplement à supprimer include_package_data=True.

Après en lisant ici , j'ai réalisé que include_package_data vise à inclure les fichiers de contrôle de version, par opposition à simplement "inclure les données du paquet" comme son nom l'indique. De la docs:

Les fichiers de données [de include_package_data] doivent être sous contrôle CVS ou Subversion

...

Si vous souhaitez un contrôle plus fin sur les fichiers inclus (par exemple, si Vous avez des fichiers de documentation dans vos répertoires de package et que vous souhaitez les exclure de l'installation), vous pouvez également utiliser le mot clé package_data.

Supprimer cet argument a corrigé le problème, ce qui est, par coïncidence, la raison pour laquelle cela a également fonctionné lorsque vous êtes passé à distutils, car il ne prend pas cet argument.

23
Joe

Suivre la recommandation de @Joe de supprimer la ligne include_package_data=True a également fonctionné pour moi. 

Pour élaborer un peu plus, j'ai le fichier no MANIFEST.in. J'utilise Git et pas CVS.

Le référentiel prend ce genre de forme:

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            Word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'Word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

Je lance python setup.py sdist pour une distribution source (je n'ai pas essayé le binaire).

Et à l’intérieur d’un tout nouvel environnement virtuel, j’ai un myproject-4.19.tar.gz, fichier, Et j’utilise

(venv) pip install ~/myproject-4.19.tar.gz
...

Et à part tout ce qui est installé sur le site-packages de mon environnement virtuel, ces fichiers de données spéciaux sont installés sur les /opt/local/myproject/data et /opt/local/myproject/etc.

15
HeyWatchThis

include_package_data=True a travaillé pour moi.

Si vous utilisez git, n'oubliez pas d'inclure setuptools-git dans install_requires. Beaucoup moins ennuyeux que d'avoir une Manifest ou d'inclure tous les chemins dans package_data (dans mon cas, c'est une application Django avec toutes sortes de statistiques)

(collé le commentaire que j'ai fait, comme k3-rnc mentionné, il est réellement utile tel quel)

10
vincent

Update: cette réponse est ancienne et les informations ne sont plus valides. Toutes les configurations setup.py doivent utiliser import setuptools. J'ai ajouté une réponse plus complète sur https://stackoverflow.com/a/49501350/64313


J'ai résolu ce problème en passant aux distutils. On dirait que distribuer est obsolète et/ou cassé.

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)
4
cmcginty

Question ancienne et pourtant ... la gestion des paquets en python laisse vraiment à désirer. J'ai donc eu le cas d'utilisation d'installation à l'aide de pip localement dans un répertoire spécifié et j'ai été surpris de constater que les chemins package_data et data_files ne fonctionnaient pas. Je n'aimais pas ajouter encore un autre fichier au référentiel, alors j'ai fini par utiliser data_files et l'option setup.py --install-data; quelque chose comme ça

pip install . --install-option="--install-data=$PWD/package" -t package  
3
Mat Baker

J'ai eu le même problème ces deux derniers jours mais même ce fil n'a pas été clair pour moi. Tout est déroutant. J'ai donc fait mes recherches et trouvé une solution. En gros, dans ce cas-ci, voici ce que vous devriez faire:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

L'autre réponse complète stackoverflow ici

0
mctrjalloh

Déplacer le dossier contenant les données du paquet dans le dossier du module a résolu le problème pour moi.

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

0
exhuma