我有一个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.py
的install_requires
列表中。
针对这种情况,建议的工作流程是什么?
问题是setup.py
导入sqlemon
导入pyyaml
(原则上任何其他依赖项),因此如果不安装这些依赖项,就不可能处理它。 我setup.py
导入sqlemon
的原因是获取版本号。 这里解释了版本号的更好策略,这使我们不必在setup.py
中导入自己的项目 .