195 votes

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.

379voto

larsks Points 23184

Je me rends compte que c'est une vieille question...mais pour les gens à trouver son chemin ici via Google: package_data est faible vers le bas, sale mensonge. Il est seulement utilisé lors de la construction binaire paquets (python setup.py bdist ...), mais pas lors de la construction de la source de paquets (python setup.py sdist ...). C'est, bien sûr, ridicule -- on pourrait s'attendre à ce que la construction d'une source de distribution seraient le résultat d'un ensemble de fichiers qui peut être envoyé à quelqu'un d'autre pour construire la distribution binaire.

En tout cas, à l'aide de MANIFEST.in va travailler à la fois pour les binaires et pour les distributions source.

45voto

Joe Points 2650

J'ai juste eu ce même problème. La solution était tout simplement de supprimer include_package_data=True.

Après la lecture ici, j'ai réalisé qu' 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. À partir de la documentation:

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

...

Si vous souhaitez un contrôle plus précis sur ce que sont les fichiers inclus (par exemple, si vous avez des fichiers de la documentation dans votre forfait répertoires et que vous souhaitez exclure de l'installation), alors vous pouvez aussi utiliser l' package_data mot-clé.

Cet argument fixe, qui est justement pourquoi il a également travaillé au moment de passer à distutils, car il ne prend pas cet argument.

24voto

HeyWatchThis Points 2221

Suivant @Joe 's recommandation pour supprimer l' include_package_data=True ligne a également travaillé pour moi.

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

Référentiel prend cette 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 exécutez python setup.py sdist pour une source de distrib (n'ai pas essayé binaire).

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

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

Et d'autres que tout se installé à mon environnement virtuel de l' site-packages, ces fichiers de données sont installées /opt/local/myproject/data et /opt/local/myproject/etc.

6voto

Casey Points 19286

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

3voto

exhuma Points 3619

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

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

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