2017-06-04 40 views
0

我有一个Python包的源看起来像这样在PyPI上开发python包时如何管理依赖关系?

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

大部分代码是__init__.py,它具有以下的进口:

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

如果我们运行

python setup.py sdist 

我们看到以下错误

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 

这表明我工作在我的项目中的virtualenv必须安装所有项目的依赖项才能进行开发。 我想这是没有道理的,但我不能完全肯定的工作流程应该是什么样子,因为该项目的依赖在setup.py列:在requirements.txt

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' 
      ], 
) 

我通常把需求,以便开发人员可以做pip install -r requirements.txt,但因为要求已经在setup.py中看起来多余。

此外,在将我的项目上传到PyPI后,当我尝试从pypi进行pip安装时,安装失败,除非我已经在我的virtualenv中安装了pyyaml。显然这不是我们想要的行为; pyyaml应自动安装,因为它在setup.pyinstall_requires列表中列出。

这种情况下推荐的工作流程是什么?

+0

它发生在我身上,一个选项可能是不导入我自己的包'setup.py' ... – DanielSank

+0

[相关](https://stackoverflow.com/questions/2058802/how-cani-i-获得最版本定义功能于设置-PY-setuptools的 - 在 - 我的包) – DanielSank

回答

0

问题是,setup.py进口sqlemon其中进口pyyaml(原则上任何其他依赖项),所以不可能没有安装这些依赖项来处理它。 我有setup.py导入sqlemon的原因是为了获得版本号。 解释版本号的更好策略here,它允许我们不导入我们自己的项目setup.py