微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

setuptools.setupinstall_requires不安装列出的软件包

如何解决setuptools.setupinstall_requires不安装列出的软件包

我正在使用:

python 3.7.4
setuptools 50.3.0
pip 20.2.3

我有一个公共的github存储库,我正试图将其转换为要安装的软件包。它需要requests才能正常工作。

相关文件的组织方式如下:

package
    __init__.py
    __version__.py
    functions.py
setup.py

这在每个文件中:

# __init__.py

from .functions import first_function,second_function
# __version__.py

# version,title,etc. are defined here
__requests__ = 'requests>=2,<3'
# setup.py

import setuptools

from package.__version__ import __requests__,...

setuptools.setup(
    ...,install_requires=[__requests__]
)

当我尝试使用pip install git+https://github.com/<user>/<repository name>.git@<version tag>进行安装时,我得到了ModuleNotFoundError: No module named 'requests'

我已经浏览了几个流行的github存储库(例如requestspandas),github上的pypa示例项目,setuptools的文档以及许多github问题以及stackoverflow问题,但我仍然无法弄清我在做什么错。

解决方法

setup.py期间导入代码将失败,因为将不会安装依赖项(实际上是从setup.py instal_requires->代码->需要安装的请求创建了一个循环)>

有大约2种方法可以解决这个问题

一种方法是在运行时使用importlib.metadata来读取依赖项(这是我的建议!)

if sys.version_info >= (3,8):
    import importlib.metadata as importlib_metadata
else:
    import importlib_metadata  # pip install importlib-metadata backport

dist = importlib_metadata.distribution('yourpackage')
# this is a list for example
# >>> importlib.metadata.distribution('pre-commit').requires
# ['cfgv>=2.0.0','identify>=1.0.0','nodeenv>=0.11.1','pyyaml>=5.1','toml','virtualenv>=20.0.8','importlib-resources; python_version < "3.7"','importlib-metadata; python_version < "3.8"']
__requests__,= [req for req in dist.requires if req.startswith('requests>=')]

另一种选择是读取您的__init__.py而不是将其导入并手动解析:

例如:

import ast

with open('myproject/__init__.py',encoding='UTF-8') as f:
    for line in f:
        if line.startswith('__requests__ ='):
            requests_version = ast.literal_eval(line.split('=')[1])
            break
    else:
        raise AssertionError(f'__requests__ = not found in {f.name}')

我个人建议前者,尽管我已经看到两种方法都出于各种原因

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。