在开发要在 PyPI 上分发的 python 包时,如何管理依赖项?



我有一个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中:

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

我通常将需求放在requirements.txt中,以便开发人员可以做pip install -r requirements.txt,但由于需求已经在setup.py,这似乎是多余的。

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

针对这种情况,建议的工作流程是什么?

问题是setup.py导入sqlemon导入pyyaml(原则上任何其他依赖项),因此如果不安装这些依赖项,就不可能处理它。 我setup.py导入sqlemon的原因是获取版本号。 这里解释了版本号的更好策略,这使我们不必在setup.py中导入自己的项目 .

相关内容

  • 没有找到相关文章

最新更新