web-dev-qa-db-fra.com

Python Emballage: les fichiers de données sont correctement placés dans le fichier tar.gz mais ne sont pas installés à l'environnement virtuel

Je ne peux pas installer correctement le projet package_fiddler à mon environnement virtuel.

J'ai compris que MANIFEST.in est responsable de la mise en place des fichiers non -.py dans Package_fiddler-0.0.0.tar.gz généré lors de l'exécution de python setup.py sdist.

Alors j'ai fait:

(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz

Mais cela n'a pas installé les fichiers de données ni le colis à /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages.

J'ai essayé de nombreuses configurations des arguments de configuration package_data, include_package_data et data_files Mais je semble avoir utilisé la mauvaise configuration à chaque fois.

quelle configuration de package_data et/ou include_package_data et/ou data_files installera correctement package_fiddler à mon environnement virtuel?

arbre de projet

.
├── MANIFEST.in
├── package_fiddler
│   ├── data
│   │   ├── example.html
│   │   └── stylesheets
│   │       └── example.css
│   └── __init__.py
├── README.rst
└── setup.py

setup.py

from setuptools import setup


setup(
    name='Package_fiddler',
    entry_points={
    'console_scripts': ['package_fiddler = package_fiddler:main', ],},
    long_description=open('README.rst').read(),
    packages=['package_fiddler',])

Manifeste.in

include README.rst
recursive-include package_fiddler/data *

Quelles configurations de setup.py (avec base de code ci-dessus) ai-je essayé?

Configuration1

Ajouter:

package_data={"": ['package_fiddler/data/*',]}

Configuration2

Ajouter:

package_data={"": ['*.html', '*.css', '*.rst']}

Configuration

Ajouter:

include_package_data=True

Configuration4

Ajouter:

package_data={"": ['package_fiddler/data',]}

Supprimer:

packages=['package_fiddler',]

Configuration5 (suggestion de Chris)

Ajouter:

package_data={"data": ['package_fiddler/data',]}

Supprimer:

packages=['package_fiddler',]

Configuration 6

Ajouter:

package_data={"": ['package_fiddler/data/*',]}

Supprimer:

packages=['package_fiddler',]

Ces configurations ne donnent que aucun fichier n'est pas installé sur /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages.

ÉDITER

NOTE TO Toshio Kuratomi : Dans mon message d'origine, j'ai utilisé la structure des arbres la plus simple où ce problème se produit pour la clarté mais en réalité, mon arbre ressemble plus à l'arbre ci-dessous . Pour cet arbre, étrangement si je ne pose qu'un __init__.py Dans stylesheets _ Toutes les fichiers de données du dossier texts sont également installés correctement !!! Cela me dérange.

Tree 2 (Ceci installe tous les fichiers de données correctement !!)

.
├── MANIFEST.in
├── package_fiddler
│   │── stylesheets
|   |     ├── __init__.py
|   |     ├── example.css  
|   |     └── other
|   |          └── example2.css
|   |__ texts
|   |     ├── example.txt  
|   |     └── other
|   |          └── example2.txt
│   └── __init__.py
├── README.rst
└── setup.py
43
Bentley4

Personnellement, je n'aime pas la façon dont SetUptools mélange le code et les données à la fois conceptuellement et de mise en œuvre. Je pense que c'est cette mise en œuvre qui vous trébuche ici. Pour les disectools pour trouver et utiliser package_data, il a besoin des données à l'intérieur de A python package. A python package peut être un répertoire mais il doit être nécessaire une __init__.py Fichier dans le répertoire. Il semble donc que vous ayez besoin que les fichiers suivants (vides sont fins).

./package_fiddler/data/__init__.py
./package_fiddler/data/stylesheets/__init__.py
27
Toshio Kuratomi

Trouvé une solution qui a fonctionné pour moi ici .

À l'aide de setuptools==2.0.2 J'ai fait:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True,  # use MANIFEST.in during install
    ...
)
34
warvariuc

Le moyen le plus simple d'inclure les données de paquet dans "setup.py" est comme:

package_data = {'<package name>': ['<path to data file within package dir>']}

Donc, dans votre exemple:

package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}

package_data Est un dictionnaire où les touches sont les noms des packages inclus dans l'installateur. Les valeurs sous ces clés doivent être des listes de chemins de fichiers spécifiques ou de globs/wildcards dans le répertoire de packages.

Vous devez également inclure le drapeau:

Zip_safe=False

dans setup(...) Si vous souhaitez pouvoir résoudre les chemins du système de fichiers sur vos données. Sinon, vous pouvez utiliser pkg_resources Pour ce faire: http://peak.telecommunity.com/devcenter/pythonegs#accessing-package-resources

Vous n'avez certainement pas besoin d'un fichier __init__.py Dans le répertoire "Données" - ce répertoire n'est pas un module et n'est pas destiné à être importé.

12
Leo