setuptools: forfait emplacement du dossier de données
- Je utiliser setuptools pour distribuer mon paquet python. Maintenant, j'ai besoin de distribuer des fichiers de données supplémentaires.
De ce que j'ai recueillies fromt la setuptools de la documentation, j'ai besoin d'avoir mes fichiers de données à l'intérieur du répertoire du package. Cependant, je préfère avoir mes fichiers de données à l'intérieur d'un sous-répertoire dans le répertoire racine.
Ce que je voudrais éviter:
/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py
Ce que je voudrais avoir:
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
Je ne me sens pas à l'aise avec le fait d'avoir autant de sous-répertoires, si ce n'est pas essentiel. Je n'arrive pas à trouver une raison, pourquoi je /avoir/pour mettre les fichiers dans le répertoire du package. Il est également lourd de travailler avec autant de imbriquée des sous-répertoires à mon humble avis. Ou est-il une bonne raison pour justifier cette restriction?
- J'ai posé une question similaire à propos de l'utilisation de 'data_files" pour distribuer les ressources (documents, images, etc): stackoverflow.com/questions/5192386/... ...et les (deux) des réponses à la fois, a déclaré l'utilisation de 'package_data" à la place. Maintenant, je suis à l'aide de paquet de données, mais cela implique que je dois mettre mes données et les documents à l'intérieur de mon colis, c'est à dire mélangé dans mon code source. Je n'aime pas cette. Lorsque grepping ma source, je ne trouve pas juste la définition de la classe que je suis à la recherche d', mais aussi les dizaines de mentions qu'ils obtiennent à l'intérieur de mon premier, HTML et les fichiers intermédiaires. 🙁
- Je sais que cette réponse est très tardive, @JonathanHartley , mais vous pouvez faire n'importe quel répertoire, un "ensemble" par l'ajout d'une
__init__.py
fichier, même si le fichier est vide. Si vous pouviez garder un répertoire de données séparée avec un vide__init__.py
fichier pour qu'il ressemble à un paquet. Cela devrait garder grep dans votre arborescence des sources de les ramasser, mais il sera toujours reconnu comme un paquet par python et de ses outils de construction. - Une idée intéressante, merci.
- le seul problème avec cette approche est python pense que vous avez installé un paquet appelé "data". Si un autre paquet que vous avez installés essayé de regrouper les données de la même manière, vous disposez de deux contradictoires "données" packages installés.
Vous devez vous connecter pour publier un commentaire.
Option 1: Installation du paquet de données
Le principal avantage de placer les fichiers de données à l'intérieur de la racine de votre paquet Python
c'est qu'il vous permet de ne pas se soucier de l'endroit où les fichiers en direct sur un utilisateur
le système, qui peut être Windows, Mac, Linux, certaines plate-forme mobile, ou à l'intérieur d'un Oeuf. Vous pouvez
toujours trouver le répertoire
data
par rapport à votre paquet Python racine, n'importe où ou comment il est installé.Par exemple, si j'ai un projet de mise en page comme ceci:
Vous pouvez ajouter une fonction à
__init__.py
pour localiser le chemin absolu de donnéesfichier:
Sorties:
Après le projet est installé comme un Œuf le chemin d'accès à
data
va changer, mais le code n'a pas besoin de changer:Option 2: Installation à emplacement fixe
L'alternative serait de placer vos données à l'extérieur du paquet Python et puis
soit:
data
transmis via un fichier de configuration,arguments de ligne de commande ou
C'est beaucoup moins souhaitable si vous envisagez de distribuer votre projet. Si vous vraiment voulez faire cela, vous pouvez installer votre
data
où vous le souhaitez sur le système cible par la spécification de la destination pour chaque groupe de fichiers en passant par une liste de tuples:Mis à jour: Exemple d'une coquille en fonction récursive grep fichiers Python:
data_files
. Aussi, vous pouvez venir avec un shell alias grep ignorer non des fichiers Python, quelque chose commegrep_py
.data_files
faiteasy_install
malheureux. Il soulève unSandboxException
revendiquant le package ne peut pas être installée en sécurité si je le fais. J'avais l'intention d'installer docs à/usr/doc
et quelques exemples de scripts pour/usr/share
, qui sont tous deux en dehors de la sandbox 🙁os.path.join(_ROOT, 'data', path)
dansdata_files
?package_data
n'est pas seulement laid. Il viole également la norme FHS: pathname.com/fhs/pub/...data_files
détruit la structure de répertoire--chaque feuille de fichier est déposé dans la .oeuf répertoire d'installation.package_data
apparemment ne fonctionne que pour les distributions binaires (pas de source). Comment est-il difficile de copier un répertoire?Je Crois que j'ai trouvé un bon compromis qui vous permettra de mantain la structure suivante:
Vous devez installer les données package_data, pour éviter les problèmes décrits dans samplebias réponse, mais pour mantain la structure du fichier, vous devez l'ajouter à votre setup.py:
De cette façon, nous créons la structure appropriée "juste à temps", et mantain notre arborescence des sources organisé.
Pour accéder à ces fichiers de données au sein de votre code, vous 'simplement' utilisation:
data = resource_filename(Requirement.parse("main_package"), 'mypackage/data')
Je ne l'aime toujours pas avoir à spécifier 'mypackage" dans le code, comme les données pourraient n'avoir rien à faire necessarally avec ce module, mais je suppose que c'est un bon compromis.
Je pense que vous pouvez donner n'importe quoi comme argument *data_files* pour setup().