web-dev-qa-db-fra.com

À quoi sert l'argument "où" dans setuptools.find_packages?

travaillant sur un projet python, j'ai essayé de séparer le code source et les tests unitaires; voici la structure du projet:

MyProject/
    MANIFEST.in
    README.md
    setup.py
    source/
        __init.py__
        my_project/
            __init.py__
            some_module.py
    test/
        __init.py__
        my_project/
            __init.py__
            test_some_module.py

Et voici le setup.py fichier:

from setuptools import setup, find_packages

setup(
    name='my_project',
    packages=find_packages(where='./source'),
    description='My project to be packaged',
    version='1.0.0',
    author='me'
    install_requires=[
        'fastnumbers~=2.0.1',
        'numpy~=1.14.1',
        'pandas~=0.22.0'
    ],
    extras_require={
        'dev': ['check-manifest'],
        'test': [
            'mock',
            'PyHamcrest',
            'pytest',
            'pytest-cov'
        ],
    }
)

Ensuite, lorsque j'exécute la commande python3 setup.py sdist, il échoue avec la sortie suivante:

running sdist
running Egg_info
writing my_project.Egg-info/PKG-INFO
writing requirements to my_project.Egg-info/requires.txt
writing dependency_links to my_project.Egg-info/dependency_links.txt
writing top-level names to my_project.Egg-info/top_level.txt
error: package directory 'my_project' does not exist

La résultante top_level.txt le fichier semble correct:

 my_project

mais il semble que le setuptools ne démarre pas à partir du dossier source pour trouver les modules à empaqueter.

  1. Dois-je déplacer setup.py et MANIFEST.in fichiers dans le dossier source?
  2. Mais alors, à quoi sert cet argument where dans _ setuptools.find_packages fonction?
12
Géraud

Vous êtes à un pas d'une solution de travail. Ajouter

package_dir={
    '': 'source',
},

aux arguments setup():

setup(
    ...,
    packages=find_packages(where='source'),
    package_dir={
        '': 'source',
    },
    ...
)

Plus d'informations sur le remappage des packages peuvent être trouvées dans la section Liste des packages entiers .

Cependant, il semble que vous ayez créé le répertoire source dans un package python en y plaçant un __init__.py. Était-ce intentionnel? Avez-vous des instructions d'importation comme

import source.my_project
from source.my_project.my_module import stuff

ou similaire, en utilisant source comme nom de package? Gardez ensuite à l’esprit que les importations échoueront une fois que vous aurez installé votre package intégré car source est omis lors de l’inclusion des sources dans la génération. Je vois deux façons:

  1. soit supprimez source/__init__.py, utilisez package_dir comme décrit ci-dessus pour créer my_project dans le package de niveau supérieur, omettez source dans les importations (si vous obtenez des erreurs, supprimez le répertoire myproject-1.0.0.Egg_info et recréez-le avec python setup.py Egg_info), ou
  2. utilisez source comme package de niveau supérieur: n'utilisez pas package_dir, recherchez les packages dans le répertoire racine du projet (packages=find_packages() sans indiquer explicitement where).
10
hoefling