J'utilise setuptools pour distribuer mon package python. Maintenant, je dois distribuer des fichiers de données supplémentaires.
D'après ce que j'ai recueilli dans la documentation de setuptools, j'ai besoin d'avoir mes fichiers de données dans le répertoire du package. Cependant, je préférerais avoir mes fichiers de données dans 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 j'aimerais avoir à la place:
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
Je ne me sens tout simplement pas à l'aise avec autant de sous-répertoires, si ce n'est pas essentiel. Je n'arrive pas à trouver une raison pour laquelle je / dois / pour mettre les fichiers dans le répertoire du package. Il est également fastidieux de travailler avec autant de sous-répertoires imbriqués IMHO. Ou y a-t-il une bonne raison qui justifierait cette restriction?
la source
__init__.py
fichier, même si ce fichier est vide. Vous pouvez donc conserver un répertoire de données séparé avec un__init__.py
fichier vide pour le faire ressembler à un package. Cela devrait empêcher grep de votre arborescence source de les récupérer, mais il sera toujours reconnu comme un paquet par python et ses outils de construction.Réponses:
Option 1: installer en tant que données de package
Le principal avantage de placer des fichiers de données à la racine de votre package Python est que cela vous permet d'éviter de vous soucier de l'emplacement des fichiers sur le système d'un utilisateur, qui peut être Windows, Mac, Linux, une plate-forme mobile ou à l'intérieur d'un œuf. Vous pouvez toujours trouver le répertoire
data
relatif à la racine de votre package Python, peu importe où et comment il est installé.Par exemple, si j'ai une mise en page de projet comme celle-ci:
Vous pouvez ajouter une fonction à
__init__.py
pour localiser un chemin absolu vers un fichier de données:Les sorties:
Une fois le projet installé en tant qu'œuf, le chemin d'accès
data
changera, mais le code n'a pas besoin de changer:Option 2: installer à un emplacement fixe
L'alternative serait de placer vos données en dehors du package Python, puis soit:
data
transmis via un fichier de configuration, des arguments de ligne de commande ouC'est beaucoup moins souhaitable si vous prévoyez de distribuer votre projet. Si vous voulez vraiment faire cela, vous pouvez installer votre
data
où vous le souhaitez sur le système cible en spécifiant la destination de chaque groupe de fichiers en passant une liste de tuples:Mise à jour : Exemple de fonction shell pour grep récursivement les fichiers Python:
la source
data_files
. De plus, vous pouvez créer un alias shell pour que grep ignore les fichiers non Python, quelque chose commegrep_py
.Je pense avoir trouvé un bon compromis qui vous permettra de conserver la structure suivante:
Vous devez installer les données en tant que package_data, pour éviter les problèmes décrits dans la réponse samplebias, mais pour conserver la structure du fichier, vous devez ajouter à votre setup.py:
De cette façon, nous créons la structure appropriée «juste à temps», et maintenons notre arbre source organisé.
Pour accéder à ces fichiers de données dans votre code, vous utilisez `` simplement '':
data = resource_filename(Requirement.parse("main_package"), 'mypackage/data')
Je n'aime toujours pas avoir à spécifier «mypackage» dans le code, car les données ne peuvent absolument rien avoir à faire avec ce module, mais je suppose que c'est un bon compromis.
la source
Je pense que vous pouvez fondamentalement donner n'importe quoi en argument * data_files * à setup () .
la source