web-dev-qa-db-fra.com

Comment puis-je inclure package_data sans un fichier MANIFEST.in?

Comment puis-je inclure package_data pour sdist sans fichier MANIFEST.in?

Mon setup.py ressemble à ceci:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),

    package_data={'': ['foo/bar.txt']},
)

Versions:

user@Host> python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools
>>> setuptools.version.__version__
'3.6'

Je ne peux tout simplement pas obtenir foo/bar.txt inclus.

Ou est ce billet de blog toujours vrai? http://blog.codekills.net/2011/07/07/15/lies,-more-lies-and-python-packaging-documentation-on--package_data-/

Au cours de la dernière heure, cependant, j'ai appris que ces déclarations se situent quelque part entre "dangereusement trompeur" et "putains de mensonges". En effet, le type principal de Python est un package source et la méthode canonique pour créer un package source est d'utiliser setup.py sdist. Cependant, les données spécifiées dans package_data ne sont pas incluses dans les distributions source - elles sont uniquement incluses dans binaire (setup.py bdist) distributions et installations (setup.py install).

Comment puis-je inclure package_data pour sdist sans fichier MANIFEST.in?

28
guettli

TL; DR : Les clés du package_data les dictionnaires sont des packages ; les valeurs sont des listes de globes. '' n'est pas un nom valide pour un package Python.

Si vous voulez avoir bar.txt être installé à côté du __init__.py du package foo, utilisez

 package_data={'foo': ['bar.txt']}

J'ai la mise en page:

foo/
        __init__.py
        bar.txt
setup.py

Maintenant, si foo est un package comme ci-dessus, faites:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),
    package_data={'foo': ['bar.txt']},
)

Et après python setup.py sdist, Je vérifie le contenu de dist/foo-2015.3.tar.gz

% tar tfz dist/foo-2015.3.tar.gz
...
foo-2015.3/foo/bar.txt
...

Cependant, si je lance votre setup.py avec package_data={'': ['foo/bar.txt']}, Je peux convenir que le foo/bar.txt sera pas ajouté à la distribution source, sauf si le foo-2015.3.Egg-info/SOURCES.txt a déjà la ligne pour foo/bar.txt - dans ce cas, le fichier apparaîtra également dans la distribution source

Aucun manifeste n'a été utilisé; la version de setuptools était 3.6 (J'ai délibérément installé la même ancienne version que vous utilisiez):

>>> import setuptools
>>> setuptools.__version__
'3.6'

Le comportement ci-dessus fonctionne également dans la norme distutils: 2.6 Installation des données de package de la documentation distutils "héritée"; avec un commentaire pour 2.7, 3.1:

Modifié dans la version [2.7, 3.1]: Tous les fichiers qui correspondent à package_data sera ajouté au fichier MANIFEST si aucun modèle n'est fourni.

41
Antti Haapala

J'ai eu le même problème et l'ai résolu en supprimant:

include_package_data=True
12
John P