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 *
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
.
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
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
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
...
)
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é.