269 votes

Y compris les fichiers non-Python setup.py

Comment faire en sorte que setup.py inclue un fichier qui ne fait pas partie du code? (Plus précisément, c'est un fichier de licence, mais cela pourrait être autre chose.)

Je veux pouvoir contrôler l'emplacement du fichier. Dans le dossier source d'origine, le fichier se trouve à la racine du package. (c’est-à-dire au même niveau que les%% supérieurs __init__.py .) Je veux qu’il reste exactement là quand le paquet est installé, quel que soit le système d’exploitation utilisé. Comment je fais ça?

293voto

Hans L Points 1081

Probablement la meilleure façon de le faire est d'utiliser la setuptools package_data directive. Cela signifie en utilisant setuptools (ou distribuer) au lieu de distutils, mais c'est un très transparente "mise à niveau".

Voici une totalité (mais non testé) exemple:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

Remarque la ligne qui est crucial ici:

package_data={'': ['license.txt']}

C'est un dictionnaire de 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:

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

La solution ici est certainement pas de renommer votre non-py fichiers avec un .py extension.

Voir Ian Bicking de 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 un MANIFESTE.dans le 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 MANIFESTE.est généralement une 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 incldue l'requirements.txt de haut niveau, de manière récursive inclure le niveau supérieur du répertoire "data":

include requirements.txt
recursive-include data *

44voto

Evan Plaice Points 5677

Pour accomplir ce que vous décrivez fera en deux étapes...

  • Le fichier doit être ajouté à l'archive source
  • setup.py doit être modifié pour installer le fichier de données de la source chemin

Étape 1: ajouter le fichier à l'archive source, de l'inclure dans le MANIFESTE

Créer un MANIFESTE de 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 ressembler à:

  • CHANGELOG.txt
  • INSTALL.txt
  • LICENSE.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

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.

Pour modifier les données le répertoire d'installation pour correspondre à la source d'installer dir...

Tirez le dossier install info de distutils avec:

from distutils.command.install import INSTALL_SCHEMES

Modifier les données du répertoire d'installation pour correspondre à la source le répertoire d'installation:

for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

Et, d'ajouter le fichier de données et l'emplacement de l'installation (en):

data_files=[('', ['LICENSE.txt'])]

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.

3voto

Gringo Suave Points 5985

Voici une réponse plus simple qui a fonctionné pour moi.

Premièrement, selon le commentaire d'un développeur Python ci-dessus, setuptools n'est pas requis:

 package_data is also available to pure distutils setup scripts 
since 2.3. – Éric Araujo
 

C’est formidable, car le fait de mettre une exigence de setuptools sur votre paquet signifie que vous devrez l’installer également. En bref:

 from distutils.core import setup

setup(
    # ...snip...
    packages          = ['pkgname'],
    package_data      = {'pkgname': ['license.txt']},
)
 

-15voto

Ram Rachum Points 10233

Vous avez trouvé une solution de contournement: j'ai renommé mes lgpl2.1_license.txt en lgpl2.1_license.txt.py et j'ai mis des guillemets triples autour du texte. Maintenant, je n'ai pas besoin d'utiliser l'option data_files ni de spécifier des chemins absolus. En faire un module Python est moche, je le sais, mais je le considère moins moche que de spécifier des chemins absolus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X