setup.py 安装不了要求的依赖项

5

我写了一个Python库,这是我的第一个Python库,已经发布在PyPIGitHub上。

这个库运行得非常好,但是setup()却不起作用。

当我通过pip install安装它时,它会下载appfly包但不会安装所需的依赖项:Flask,flask_cors, Flask-SocketIO和jsonmerge。因此,我需要自己安装它们。 如果我自己安装依赖项,它就可以正常工作,但我认为这不是使用Python库的正确方法,对吗?

这是我的setup.py文件,我做错了什么吗?

from setuptools import setup, find_packages
from appfly import __version__ as version

with open('README.md') as readme_file:
    readme = readme_file.read()

# with open('HISTORY.md') as history_file:
#     history = history_file.read()

requirements = [
    'Flask==1.0.2',
    'flask_cors==3.0.6', 
    'Flask-SocketIO==3.0.2',
    'jsonmerge==1.5.2'
]

setup(
    author="Italo José G. de Oliveira",
    author_email='italo.i@live.com',
    classifiers=[
        'Natural Language :: English',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
    ],
    description="This pkg encapsulate the base flask server configurations",
    install_requires=requirements,
    license="MIT license",
    long_description=readme,
    include_package_data=True,
    keywords='appfly',
    name='appfly',
    packages=find_packages(),
    url='https://github.com/italojs/appfly',
    version=version,
    zip_safe=False,
)

2
部分原因是你在 setup.py 中从你的包中导入。这意味着 Python 会在安装它或其依赖项之前尝试加载你的库。请参阅 https://packaging.python.org/guides/single-sourcing-package-version/#single-sourcing-the-version 了解如何正确地单一来源版本。 - user3089519
如果它有意义,我会尝试将其删除。 - Italo José
它起作用了,谢谢! - Italo José
太好了!你想把你解决问题的方法写成答案并标记为已解决吗?(或者如果你愿意,我可以把我的评论变成一个答案) - user3089519
1
发送您的第一个评论作为答案,我将标记它为解决方案,这将为您的账户设置积分。 - Italo José
2
我已经撤销了对你的问题的编辑。请参阅“在问题标题中添加[已解决]是否可以?”。 - Wai Ha Lee
3个回答

2
出现这个错误的原因是setup.py从该包中导入。这意味着在处理setup.py时(即在安装任何依赖项之前),Python将尝试导入库。
由于您仅导入软件包以获取版本信息,因此可以用不同的方法替换此导入。
一种简单的方法是直接在setup.py中包含版本信息,但缺点是版本不再是单一来源的。
其他方法需要一些工作,但允许继续单一来源的版本信息。请参见https://packaging.python.org/guides/single-sourcing-package-version/以获取建议。该页面列出了一些选项,其中有些可能比其他选项更适合您的软件包设置。我个人更喜欢选项3:

Set the value to a __version__ global variable in a dedicated module in your project (e.g. version.py), then have setup.py read and exec the value into a variable.

...

Using exec:

version = {}
with open("...sample/version.py") as fp:
    exec(fp.read(), version)
# later on we use: version['__version__']

2

0

另一个选择可能是使用versioneer包(pandas正在使用它)。

versioneer使用Git标签来创建版本值。

步骤

步骤0:使用git标签

Versioneer使用您的Git标签。

步骤1:安装versioneer

pip install versionner

步骤二:执行 versioneer

versioneer install

步骤3:按照versioneer的说明进行操作

Versioneer会要求你在setup.py和setup.cfg中进行一些更改。

在setup.py中,你需要添加类似于以下内容:

import versioneer

setup(
    version=versioneer.get_version(),
    cmdclass=versioneer.get_cmdclass()
)

而在 setup.cfg 中:

[versioneer]
VCS = git
style = pep440
versionfile_source = your_project_name/_version.py
versionfile_build = your_project_name/_version.py
tag_prefix = v
parentdir_prefix = 

注意:在示例中,我设置了“tag_prefix = v”,因为我喜欢这样的标记方式:v0.1.0、v1.0.0等。

之后,请尝试:

python setup.py version

请问您能详细说明如何使用 versioneer 实现此功能吗? - gofvonx
请更具体地说明可以做什么:D - Theo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接