Lorsque j'utilise setuptools / distribuer, je ne peux pas demander au programme d'installation d'extraire des package_data
fichiers. Tout ce que j'ai lu dit que ce qui suit est la bonne façon de le faire. Quelqu'un peut-il conseiller s'il vous plaît?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
où myapp/data/
est l'emplacement des fichiers de données.
python
setuptools
distribute
cmcginty
la source
la source
data_files
résolu le problème. Mais cela est sujet aux erreurs et ne me semble pas «juste». Quelqu'un peut-il vérifier qu'il est vraiment nécessaire de dupliquer la configuration dans les deuxpackage_data
etdata_files
?pyproject.toml
. Aucunsetup.py
fichier requis.Réponses:
Je me rends compte que c'est une vieille question, mais pour les gens qui trouvent leur chemin ici via Google:
package_data
c'est un mensonge bas et sale . Il n'est utilisé que lors de la construction de packages binaires (python setup.py bdist ...
) mais pas lors de la construction de packages sources (python setup.py sdist ...
). C'est, bien sûr, ridicule - on s'attendrait à ce que la construction d'une distribution source aboutisse à une collection de fichiers qui pourraient être envoyés à quelqu'un d'autre pour construire la distribution binaire.Dans tous les cas, l'utilisation
MANIFEST.in
fonctionnera à la fois pour les distributions binaires et sources.la source
package_data
marche pourbdist
et passdist
. Cependant ,MANIFEST.in
fonctionne poursdist
, mais pas pourbdist
! Par conséquent, le mieux que j'ai pu trouver est d'inclure à la foispackage_data
etMANIFEST.in
afin de tenir compte des deuxbdist
etsdist
.MANIFEST.in
pour les fichiers que vous n'installez pas, comme la documentation, etpackage_data
pour les fichiers que vous utilisez qui ne sont pas du code Python (comme une image ou un modèle).MANIFEST.in
etpackage_data
. Il semble queMANIFEST.in
contrôle ce qui est inclus dans la distribution, et package_data contrôle ce qui est ensuite copié dans le répertoire site_packages lors de l'installation. De manière confuse, les chemins dansMANIFEST.in
sont relatifs à l'emplacement de setup.py, etpackage_data
sont relatifs à la racine des packages individuels (par exemple, les modules).package_data
étant automatiquement inclus dans le ZIP que si vous n'avez pas de fichier MANIFEST.in existant , et seulement si vous utilisez 2.7+.J'ai juste eu ce même problème. La solution, était simplement de supprimer
include_package_data=True
.Après avoir lu ici , j'ai réalisé que l'
include_package_data
objectif était d'inclure des fichiers à partir du contrôle de version , par opposition à simplement "inclure des données de package" comme son nom l'indique. À partir de la documentation:Retirer cet argument l'a corrigé, ce qui est par coïncidence pourquoi cela a également fonctionné lorsque vous êtes passé à distutils, car il ne prend pas cet argument.
la source
include_package_data=True
entrée. La seule solution pour moi est d'ajouter une entrée dans le manifeste comme suggéré ci-dessus. Remarquez que j'utilisais setuptools, peut-être que votre version fonctionne avec «distribuer»?include_package_data
résout le problème se trouve plus loin dans le texte d'origine - Si vous utilisez l'include_package_data
argument spécifique à setuptools , les fichiers spécifiés parpackage_data
ne seront pas automatiquement ajoutés au manifeste à moins qu'ils ne soient répertoriés dans leMANIFEST.in
fichier.package_data
défini une liste non vide et de spécifierinclude_package_data=False
? Et pourquoi auriez-vous besoin de spécifier des fichiers deux fois dansMANIFEST.in
etpackage_data
?Suivre la recommandation de @Joe de supprimer la
include_package_data=True
ligne a également fonctionné pour moi.Pour élaborer un peu plus, je n'ai pas de
MANIFEST.in
dossier. J'utilise Git et non CVS.Le référentiel prend ce genre de forme:
setup.py
:Je cours
python setup.py sdist
pour une distribution source (je n'ai pas essayé le binaire).Et quand à l'intérieur d'un tout nouvel environnement virtuel, j'ai un
myproject-4.19.tar.gz
fichier et j'utiliseEt à part tout ce qui est installé dans mon environnement virtuel
site-packages
, ces fichiers de données spéciaux sont installés sur/opt/local/myproject/data
et/opt/local/myproject/etc
.la source
include_package_data=True
travaillé pour moi.Si vous utilisez git, n'oubliez pas d'inclure
setuptools-git
dansinstall_requires
. Beaucoup moins ennuyeux que d'avoir unManifest
chemin ou d'inclure tous les cheminspackage_data
(dans mon cas, c'est une application django avec toutes sortes de statiques)(collé le commentaire que j'ai fait, comme k3-rnc l'a mentionné, il est en fait utile tel quel)
la source
Mise à jour : 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/64313J'ai résolu ce problème en passant aux distutils. On dirait que distribuer est obsolète et / ou cassé.
la source
include_package_data=True
n'était pas honoré. Donc, avec ce paramètre, vous n'avez besoin que de MANIFEST.in - pas besoin de dupliquer votre liste de fichiers dans lepackage_data
paramètre.Ancienne question et pourtant ... la gestion des paquets de python laisse vraiment à désirer. J'ai donc eu le cas d'utilisation de l'installation en utilisant pip localement dans un répertoire spécifié et j'ai été surpris que les chemins package_data et data_files ne fonctionnent pas. Je n'avais pas envie d'ajouter encore un autre fichier au référentiel, alors j'ai fini par tirer parti de l'option data_files et setup.py --install-data; quelque chose comme ça
la source
Le déplacement du dossier contenant les données du package 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é?
la source
J'ai eu le même problème pendant quelques jours, mais même ce fil n'a pas pu m'aider car tout était déroutant. J'ai donc fait mes recherches et trouvé la solution suivante:
L'autre réponse complète de stackoverflow ici
la source
Supprimez simplement la ligne:
à partir de votre script de configuration, et cela fonctionnera très bien. (Testé tout à l'heure avec les derniers setuptools.)
la source
sdist
etbdist_wheel
, avez-vous vérifié pourquoi?sdist
ignorepackage_data
quand cela est défini.Utilisation de setup.cfg (setuptools ≥ 30.3.0)
À partir de setuptools 30.3.0 (publié le 08/12/2016), vous pouvez garder votre
setup.py
tout petit et déplacer la configuration dans unsetup.cfg
fichier. Avec cette approche, vous pouvez mettre les données de votre package dans une[options.package_data]
section:Dans ce cas, votre
setup.py
peut être aussi court que:Pour plus d'informations, voir la configuration de l'installation à l'aide des fichiers setup.cfg .
On parle de déprécier
setup.cfg
en faveur depyproject.toml
comme proposé dans la PEP 518 , mais cela reste provisoire à partir du 21/02/2020.la source
pip install
.pip install
, pour une version assez moderne de pip, va d'abord construire une roue, puis l'installer. Toujours pour de nombreux utilisateurs, cette approche échouera silencieusement à inclure les données du package. Voir la réponse acceptée et les commentaires en dessous pour plus de détails à ce sujet. L'utilisation de asetup.cfg
est vraiment une manière différente d'écrire ce que l'OP faisait déjàsetup.py
dans la question (en passant l'package_data
argument mot - clé dans l'appel àsetup
), donc je ne pense pas que cela soit particulièrement utile comme réponse à cette question . Cela ne règle pas du tout le problème sous-jacent.