2017-05-17 1 views
0

Je travaille sur un projet python qui contient deux modules. Les modules sont très étroitement liés et donc je veux qu'ils soient dans le même git, et pour pouvoir les développer ensemble dans mon IDE:Python - setuptools - travailler sur deux paquets dépendants (dans un seul repo?)

  • module1 dépend de module2
  • module1 a beaucoup d'autres lourds dépendances, module2 ne
  • module1 et module2 seront utilisés dans différents environnements d'exécution
  • module2 devrait être installable séparément afin qu'il puisse fonctionner en exemple une AWS Lambda

Par conséquent, j'ont essayé de mettre en place une structure de projet qui contient les deux modules dans deux dossiers dans une pension, chaque dossier comportant un setup.py afin qu'il puisse emballer. Est-ce une approche raisonnable?

\module1 
    setup.py 
    \module1 
    __init__.py 
    [scripts].py 
\module2 
    setup.py 
    \module2 
    __init__.py 
    [scripts].py 

La structure ci-dessus devrait me permettre de travailler sur le projet traitant localement module2 comme module régulier, mais le fichier setup.py signifie qu'il peut être distribué comme son propre paquet, non?

Le problème est que je ne peux pas comprendre la dépendance module2 dans l » setup.pymodule1:

from setuptools import setup 

setup(
    name="module1", 
    version="0.1", 
    packages=['module1'], # I really need to include module2 scripts here, right?... 
    install_requires=['pandas', 'numpy', ...] 
) 

Quelqu'un at-il des conseils sur la façon d'aborder ce problème? Les deux solutions que je peux deviner sont:

  • Emballage et publication module2 sur son propre avant selon elle de module1. Cela rend le développement beaucoup plus inflexible
  • Imbrication au sein de module1 donc je peux l'inclure dans l'argument packages à la fonction setup(...). Cela brise la clarté que module1 devrait traiter module2 comme si elle était essentiellement une dépendance externe ...

Répondre

2

Votre principale raison de les garder dans le même référentiel est de permettre un travail parallèle sur les deux modules dans votre IDE. Je suggère de garder les modules dans des référentiels distincts et d'utiliser le mode editable pour le mode pip ou develop pour setuptools pour atteindre le développement "parallèle". Fondamentalement, vous installez module2 dans un mode develop/editable lorsque vous l'utilisez dans module1. Par la suite, vous verrez toutes les modifications apportées à module2 immédiatement tout en développant module1

Faire la même chose également faire en sorte que des choses comme pip install git+<git_directory> ne se cassent pas et vous pouvez installer directement à partir git

+0

Merci @Rubbal. Donc, si je devais utiliser deux repos distincts et le mode de développement setuptools, comment pourrais-je déclarer la dépendance de 'module1' sur' module2' dans 'setup.py'? Je comprends en utilisant 'pip -e [path]', mais quel est l'équivalent dans 'setup.py'? – rjmurt

+0

Vous l'ajouterez simplement à 'install_requires' (j'avais l'habitude de garder une condition.txt afin que je puisse directement installer toutes les exigences tout en développant. Dans setup.py, j'analyserais le requirements.txt et j'ajouterais ceux-ci à install_requires) – Rubbal

+0

Je pense que c'est probablement la bonne réponse (bien que je n'ai jamais eu 'install_requires' fonctionnant correctement). Je suppose que ma question est vraiment de savoir s'il existe/devrait y avoir un mécanisme pour construire plus d'un paquet de style PyPI à partir d'un seul ensemble de code. Il semble que l'utilisation de setuptools pour l'étape de construction n'est pas si flexible ... – rjmurt