2017-06-04 1 views
0

J'ai un paquet python dont la source ressemble à ceComment les dépendances sont-elles gérées lors du développement d'un paquet python à distribuer sur PyPI?

├── MANIFEST.in 
├── README.rst 
├── setup.cfg 
├── setup.py 
└── sqlemon 
    ├── connection_strings.py 
    └── __init__.py 

La plupart du code est en __init__.py, qui a les importations suivantes:

import os 
import sqlemon.connections_strings as sqlcs 
import yaml #This is the problem 

Si nous courons

python setup.py sdist 

nous voyons l'erreur suivante

Traceback (most recent call last): 
    File "setup.py", line 2, in <module> 
    import sqlemon 
    File "/home/danielsank/src/sqlemon/sqlemon/__init__.py", line 4, in <module> 
    import yaml 
ImportError: No module named yaml 

Ceci suggère que le virtualenv dans lequel je travaille sur mon projet doit avoir toutes les dépendances du projet installées pour le développement. Je suppose que ce n'est pas déraisonnable, mais je ne suis pas tout à fait sûr de ce que le flux de travail devrait ressembler parce que les dépendances de projet sont répertoriés dans setup.py:

from distutils.core import setup 
import sqlemon 

version = sqlemon.__version__ 
project_name = sqlemon.__project_name__ 

setup(name=project_name, 
     # Irrelevant lines removed 
     install_requires=[ 
      'sqlalchemy', 
      'alembic', 
      'pyyaml', 
      'sqlalchemy-schemadisplay' 
      ], 
) 

I exigences habituellement mis en requirements.txt afin que le développeur peut faire pip install -r requirements.txt, mais puisque les exigences sont déjà dans setup.py qui semble redondant.

En outre, après avoir téléchargé mon projet sur PyPI, lorsque j'essaye de pip installer à partir de pypi, l'installation échoue sauf si j'ai déjà pyyaml installé dans mon virtualenv. Évidemment, ce n'est pas le comportement que nous voulons; pyyaml doit s'installer automatiquement comme indiqué dans la liste install_requires dans setup.py.

Quel est le flux de travail recommandé pour cette situation?

+0

Il me semble qu'une option pourrait être de ne pas importer mon propre paquet dans 'setup.py' ... – DanielSank

+0

[Relevant] (https://stackoverflow.com/questions/2058802/how-can-i- get-la-version-définie-dans-setup-py-setuptools-dans-mon-paquet) – DanielSank

Répondre

0

Le problème est que les importations setup.pysqlemon qui importe pyyaml (et, en principe, toutes les autres dépendances) il est donc impossible de le traiter sans avoir ces dépendances installées. La raison pour laquelle j'ai eu setup.py l'importation sqlemon était d'obtenir le numéro de version. Une meilleure stratégie pour les numéros de version est expliqué here, ce qui nous permet de ne pas importer notre propre projet en setup.py.