Y compris les non-fichiers Python avec setup.py
Comment puis-je faire setup.py
inclure un fichier qui n'est pas partie du code? (Plus précisément, c'est un fichier de licence, mais il pourrait être tout autre chose.)
Je veux être en mesure de contrôler l'emplacement du fichier. Dans le dossier source d'origine, le fichier est à la racine du package. (c'est à dire au même niveau que le premier __init__.py
.) Je veux rester exactement là quand le paquet est installé, indépendamment du système d'exploitation. Comment dois-je faire?
- comment faites-vous en ce moment? votre question précédente indique que vous êtes familier avec la façon d'ajouter le fichier de licence, alors, quel est votre code qui "ne fonctionne pas"?
data_files = [('', ['lgpl2.1_license.txt',]),]
met dans la Python26 dossier.- Après quelques retours négatifs, j'ai lu votre question et a réalisé qu'il me manquait. J'ai mis à jour ma réponse à fournir un non-hackish solution à votre question qui ne nécessite pas de modules supplémentaires (tels que setuptools ou distribuer).
- Merci Evan. Cependant, je suis parfaitement d'accord avec l'utilisation de setuptools, car il est si répandue.
Vous devez vous connecter pour publier un commentaire.
Probablement la meilleure façon de le faire est d'utiliser la
setuptools
package_data
directive. Cela signifie en utilisantsetuptools
(oudistribution
) au lieu dedistutils
, mais c'est un très transparente "mise à niveau".Voici une totalité (mais non testé) exemple:
Notez les lignes qui sont à la critique ici:
package_data
est undict
les noms de package (vide = tous les paquets) à une liste de modèles (peut inclure des boules). Par exemple, si vous voulez seulement de spécifier les fichiers à l'intérieur de votre colis, vous pouvez le faire aussi:La solution ici est certainement pas de renommer vos non-
py
fichiers avec un.py
extension.Voir Ian Bicking présentation pour plus d'info.
Mise à JOUR: un Autre [Mieux] Approche
Une autre approche qui fonctionne bien si vous voulez juste pour contrôler le contenu de la source de distribution (
sdist
) et avez des fichiers à l'extérieur de l'emballage (p. ex. répertoire de niveau supérieur) est d'ajouter unMANIFEST.in
fichier. Voir la documentation Python pour le format de ce fichier.Depuis la rédaction de cette réponse, j'ai trouvé que l'utilisation de
MANIFEST.in
est généralement un moins frustrant approche de la juste assurez-vous que votre source de distribution (tar.gz
) a les fichiers dont vous avez besoin.Par exemple, si vous vouliez inclure la
requirements.txt
de haut-niveau, de manière récursive inclure le niveau supérieur du répertoire "data":Néanmoins, pour que ces fichiers soient copiés au moment de l'installation du package du dossier à l'intérieur du site-packages, vous aurez besoin de fournir
include_package_data=True
à lasetup()
fonction. Voir L'Ajout De Non-Fichiers De Code pour plus d'informations.include_package_data
comme qui dirait dans SVN et de la Subversion et semble marcher surpackage_data
parfois. Voir stackoverflow.com/questions/7522250/...__init__.py
paquet marqueur. Si cela est manquant pas d'avertissement est généré et pas les epe sont copiéspackage_data
ne fonctionnait pas. De faire deux choses (s'ajoutant à se MANIFESTER.dans et en ajoutant à package_data) fixe pour moi.Pour accomplir ce que vous décrivez fera en deux étapes...
Étape 1: ajouter le fichier à l'archive source, de l'inclure dans le MANIFESTE
Créer un MANIFESTE modèle dans le dossier qui contient setup.py
Le MANIFESTE est en fait un fichier texte avec une liste de tous les fichiers qui seront inclus dans l'archive source.
Voici ce que le MANIFESTE pour mon projet ressemble:
Remarque: lors de la sdist ne ajouter quelques fichiers automatiquement, je préfère préciser explicitement eux pour être sûr plutôt que de prédire ce qu'il fait et ne fait pas.
Étape 2: installer le fichier de données dans le dossier source, de le modifier setup.py
Puisque vous êtes à la recherche d'ajouter un fichier de données (LICENSE.txt) à la source dossier d'installation, vous devez modifier les données de chemin d'installation pour correspondre à la source chemin d'installation. Cela est nécessaire parce que, par défaut, les fichiers de données sont installés à un emplacement différent de celui des fichiers source.
De modifier les données, le répertoire d'installation pour correspondre à la source d'installer dir...
Tirez le dossier install info de distutils avec:
Modifier les données le répertoire d'installation pour correspondre à la source d'installer dir:
Et, d'ajouter le fichier de données et l'emplacement de l'installation (en):
Remarque: Les étapes ci-dessus doivent accomplir exactement ce que vous avez décrit dans un façon standard sans aucune extension, dans les bibliothèques.
package_data
ne fonctionne pas si le fichier n'est pas dans le package.créer
MANIFEST.in
dans la racine du projet avecrecursive-include
le répertoire désiré ouinclude
avec le nom de fichier.la documentation peut être trouvée ici
Dans setup.py en vertu de l'installation( :
package_data
aura pas d'influence sur cesetup.py install
n', sauf si vous modifiez la commande d'installation lui-même. Si ces fichiers sont sous répertoire du package, qui est généralement quelque chose que vous voulez éviter.Ici est plus simple de répondre à ce qui a fonctionné pour moi.
D'abord, par un Python Dev commentaire ci-dessus, setuptools n'est pas nécessaire:
C'est génial parce que mettre un setuptools exigence sur votre forfait signifie que vous devrez l'installer aussi. En bref:
pkgame
n'existe pasÉtape 1: créer un
MANIFEST.in
fichier dans le même dossier setup.pyÉtape 2: indiquer le chemin relatif vers les fichiers que vous souhaitez ajouter dans
MANIFEST.in
Étape 3:définir
include_package_data=True
dans lesetup()
fonction pour copier ces fichiers sur le site-packageréférence est ici
Je voulais juste suivi sur quelque chose que j'ai trouvé de travail avec Python 2.7 sur Centos 6. L'ajout de la package_data ou data_files comme mentionné ci-dessus ne fonctionne pas pour moi. J'ai ajouté un MANIFESTE.DANS les fichiers que je voulais qui a mis les non-python fichiers dans l'archive, mais n'a pas les installer sur l'ordinateur cible via RPM.
En fin de compte, j'ai été en mesure d'obtenir les fichiers dans ma solution à l'aide du menu "options" dans le setup/setuptools. Les fichiers d'options vous permettent de modifier les différentes sections du fichier de spécification de setup.py. Comme suit.
fichier MANIFESTE.dans:
fichier - filewithinstallcommands:
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 (ça après le renvoi de la docs):
La dernière ligne était, curieusement, aussi crucial pour moi (vous pouvez aussi omettre cet argument mot-clé - il fonctionne de la même façon).
Qu'il copie tous les fichiers texte dans votre haut-niveau ou le répertoire racine (un niveau au-dessus du paquet
mypkg
vous souhaitez distribuer).Espérons que cette aide!
Trouvé une solution: j'ai renommé mon
lgpl2.1_license.txt
àlgpl2.1_license.txt.py
, et de mettre du triple guillemets autour du texte. Maintenant, je n'ai pas besoin d'utiliser ledata_files
option, ni de spécifier des chemins absolus. En faisant un module Python est moche, je sais, mais je considère qu'il est moins laid que la spécification des chemins absolus.