Comment puis-je faire setup.py
inclure un fichier qui ne fait pas partie du code? (Plus précisément, c'est un fichier de licence, mais cela pourrait être autre chose.)
Je veux pouvoir contrôler l'emplacement du fichier. Dans le dossier source d'origine, le fichier se trouve à la racine du package. (c'est-à-dire au même niveau que le plus haut __init__.py
.) Je veux qu'il reste exactement là lorsque le package est installé, quel que soit le système d'exploitation. Comment je fais ça?
data_files = [('', ['lgpl2.1_license.txt',]),]
le place dans le dossier Python26.Réponses:
La meilleure façon de procéder est probablement d'utiliser la
setuptools
package_data
directive. Cela signifie utilisersetuptools
(oudistribute
) au lieu dedistutils
, mais il s'agit d'une "mise à niveau" très transparente.Voici un exemple complet (mais non testé):
Notez les lignes spécifiques qui sont essentielles ici:
package_data
est un nomdict
de package (vide = tous les packages) à une liste de modèles (peut inclure des globes). Par exemple, si vous souhaitez uniquement spécifier des fichiers dans votre package, vous pouvez également le faire:La solution ici est définitivement de ne pas renommer vos non-
py
fichiers avec une.py
extension.Voir la présentation de Ian Bicking pour plus d'informations.
MISE À JOUR: Une autre [meilleure] approche
Une autre approche qui fonctionne bien si vous souhaitez simplement contrôler le contenu de la distribution source (
sdist
) et avoir des fichiers en dehors du package (par exemple, le répertoire de niveau supérieur) consiste à ajouter unMANIFEST.in
fichier. Voir la documentation Python pour le format de ce fichier.Depuis la rédaction de cette réponse, j'ai constaté que l'utilisation
MANIFEST.in
est généralement une approche moins frustrante pour s'assurer que votre distribution source (tar.gz
) possède les fichiers dont vous avez besoin.Par exemple, si vous souhaitez inclure le à
requirements.txt
partir du niveau supérieur, incluez récursivement le répertoire "données" de niveau supérieur:Néanmoins, pour que ces fichiers soient copiés au moment de l'installation dans le dossier du package à l'intérieur de site-packages, vous devrez fournir
include_package_data=True
lasetup()
fonction. Voir Ajout de fichiers non codés pour plus d'informations.la source
Pour accomplir ce que vous décrivez, il faudra deux étapes ...
Étape 1: pour ajouter le fichier à l'archive tar source, incluez-le dans le MANIFEST
Créez un modèle MANIFEST dans le dossier qui contient setup.py
Le MANIFEST est essentiellement un fichier texte avec une liste de tous les fichiers qui seront inclus dans l'archive tar source.
Voici à quoi ressemble le MANIFEST pour mon projet:
Note: Bien que sdist n'ajouter quelques fichiers automatiquement , je préfère les spécifier explicitement pour être sûr au lieu de prédire ce qu'il fait et ne fonctionne pas.
Étape 2: pour installer le fichier de données dans le dossier source, modifiez setup.py
Puisque vous cherchez à ajouter un fichier de données (LICENSE.txt) au dossier d'installation source, vous devez modifier le chemin d'installation des données pour qu'il corresponde au chemin d'installation source. Cela est nécessaire car, par défaut, les fichiers de données sont installés à un emplacement différent de celui des fichiers source.
Pour modifier le répertoire d'installation des données afin qu'il corresponde au répertoire d'installation source ...
Tirez les informations du répertoire d'installation de distutils avec:
Modifiez le répertoire d'installation des données pour qu'il corresponde au répertoire d'installation source:
Et, ajoutez le fichier de données et l'emplacement à setup ():
Remarque: Les étapes ci-dessus doivent accomplir exactement ce que vous avez décrit de manière standard sans nécessiter de bibliothèques d'extension.
la source
package_data
ne fonctionne pas si le fichier n'est pas dans le package.créer
MANIFEST.in
à la racine du projet avecrecursive-include
le répertoire requis ouinclude
avec le nom du fichier.la documentation peut être trouvée ici
la source
Je voulais poster un commentaire sur l'une des questions mais je n'ai pas assez de réputation pour le faire>.>
Voici ce qui a fonctionné pour moi (je l'ai trouvé après avoir référé les documents):
La dernière ligne était, étrangement, également cruciale pour moi (vous pouvez également omettre cet argument de mot clé - cela fonctionne de la même manière).
Ce qu'il fait, c'est qu'il copie tous les fichiers texte dans votre répertoire racine ou racine (un niveau au-dessus du package que
mypkg
vous souhaitez distribuer).J'espère que cela t'aides!
la source
MANIFEST.in
, cela a fonctionné pour moi. La dernière ligne a également été cruciale pour moi. Mes lignes étaientinclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Nous sommes en 2019, et voici ce qui fonctionne - malgré les conseils ici et là, ce que j'ai trouvé sur Internet à mi-chemin documenté utilise
setuptools_scm
, transmis en tant qu'optionssetuptools.setup
. Cela inclura tous les fichiers de données qui sont versionnés sur votre VCS, que ce soit git ou tout autre, dans le paquetage wheel, et fera "pip install" à partir du référentiel git pour apporter ces fichiers.Donc, je viens d'ajouter ces deux lignes à l'appel de configuration sur "setup.py". Aucune installation supplémentaire ou importation requise:
Pas besoin de lister manuellement package_data, ou dans un fichier MANIFEST.in - s'il est versionné, il est inclus dans le package. Les documents sur "setuptools_scm" mettent l'accent sur la création d'un numéro de version à partir de la position de validation, et ignorent la partie vraiment importante de l'ajout des fichiers de données. (Je m'en fiche si mon fichier de roue intermédiaire est nommé "* 0.2.2.dev45 + g3495a1f" ou utilisera le numéro de version codé en dur "0.3.0dev0" que j'ai tapé - mais en laissant des fichiers cruciaux au programme pour travailler derrière est quelque peu important)
la source
Étape 1: créez un
MANIFEST.in
fichier dans le même dossier avec setup.pyÉtape 2: inclure le chemin d'accès relatif aux fichiers que vous souhaitez ajouter
MANIFEST.in
Étape 3: définissez
include_package_data=True
lasetup()
fonction pour copier ces fichiers dans site-packageLa référence est ici.
la source
Dans setup.py sous setup (:
la source
package_data
n'aura aucune influence sur ce qui sesetup.py install
passe, sauf si vous modifiez la commande d'installation elle-même. À moins que ces fichiers ne se trouvent dans le répertoire du package, ce que vous souhaitez généralement éviter.Voici une réponse plus simple qui a fonctionné pour moi.
Tout d'abord, selon le commentaire d'un développeur Python ci-dessus, setuptools n'est pas requis:
C'est génial car mettre une exigence setuptools sur votre package signifie que vous devrez également l'installer. En bref:
la source
pkgame
n'existe pasJe voulais juste faire un suivi sur quelque chose que j'ai trouvé en travaillant avec Python 2.7 sur Centos 6. L'ajout des packages_data ou data_files comme mentionné ci-dessus n'a pas fonctionné pour moi. J'ai ajouté un MANIFEST.IN avec les fichiers que je voulais qui mettaient les fichiers non-python dans l'archive tar, mais je ne les ai pas installés sur la machine cible via RPM.
Au final, j'ai pu récupérer les fichiers dans ma solution en utilisant les "options" du setup / setuptools. Les fichiers d'options vous permettent de modifier différentes sections du fichier de spécifications à partir de setup.py. Comme suit.
fichier - MANIFEST.in:
file - filewithinstallcommands:
la source
J'ai trouvé une solution de contournement: j'ai renommé mon
lgpl2.1_license.txt
enlgpl2.1_license.txt.py
et j'ai mis des triples guillemets autour du texte. Maintenant, je n'ai plus besoin d'utiliser l'data_files
option ni de spécifier de chemins absolus. En faire un module Python est moche, je sais, mais je le considère moins moche que de spécifier des chemins absolus.la source