首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'extras_require‘必须是一个字典,其值为字符串或包含有效的项目/版本需求说明符的字符串列表。

'extras_require‘必须是一个字典,其值为字符串或包含有效的项目/版本需求说明符的字符串列表。
EN

Stack Overflow用户
提问于 2020-09-01 12:47:34
回答 2查看 4.8K关注 0票数 1

我有一个setup.py,它包含以下内容:

代码语言:javascript
复制
from pip._internal.req import parse_requirements

def load_requirements(fname):
    """Turn requirements.txt into a list"""
    reqs = parse_requirements(fname, session="test")
    return [str(ir.requirement) for ir in reqs]


setup(
    name="Projectname",
    [...]
    python_requires='>=3.6',
    extras_require={
        'dev': load_requirements('./requirements/dev.txt')
        },
    install_requires=load_requirements('./requirements/prod.txt')
)

我的./requirements/prod.txt看起来是这样的:

代码语言:javascript
复制
-r common.txt

而且我的./requirements/dev.txt也是类似的,但是有一些特定于开发的包。我的./requirements/common.txt包含一个从github链接中安装包的行,如:

代码语言:javascript
复制
-e git://github.com/BioGeek/tta_wrapper.git@master#egg=tta_wrapper

但是,由于我添加了该行,命令python setup.py build在以下方面失败:

代码语言:javascript
复制
error in Projectname setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.

相关软件包的版本:

代码语言:javascript
复制
pip                            20.2.2
setuptools                     50.0.0

如何修改我的setup.py或需求文件来解决这个问题?

编辑

在修改了我的setup.py (如安沃瑟 of 马蒂恩皮特斯中所示)之后,我可以确认load_requirements现在在需要时将我的需求文件转换成一个具有name@ url直接引用语法的列表。

代码语言:javascript
复制
>>> load_requirements('./requirements/prod.txt')
['absl-py==0.8.1', 'GitPython==3.1.0', 'numpy==1.18.4', 'pip==20.2.2', 'protobuf==3.12.0', 'setuptools==41.0.0', 'scikit_learn==0.22', 'tensorflow_hub==0.8.0', 'importlib-metadata==1.6.1', 'keras-tuner==1.0.1', 'apache-beam==2.23.0', 'ml-metadata==0.23.0', 'pyarrow==0.17.0', 'tensorflow==2.3.0', 'tensorflow-data-validation==0.23.0', 'tensorflow-metadata==0.23.0', 'tensorflow-model-analysis==0.23.0', 'tensorflow-transform==0.23.0', 'tta_wrapper @ git://github.com/BioGeek/tta_wrapper.git@master']

但是,现在运行python setup.py build时会出现以下错误

代码语言:javascript
复制
$ python setup.py build
/home/biogeek/code/programname/env/lib/python3.6/site-packages/_distutils_hack/__init__.py:30: UserWarning: Setuptools is replacing distutils.
  warnings.warn("Setuptools is replacing distutils.")
running build
Traceback (most recent call last):
  File "setup.py", line 91, in <module>
    install_requires=load_requirements('./requirements/prod.txt')
  File "/home/biogeek/code/programname/env/lib/python3.6/site-packages/setuptools/__init__.py", line 153, in setup
    return distutils.core.setup(**attrs)
  File "/home/biogeek/code/programname/env/lib/python3.6/site-packages/setuptools/_distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/home/biogeek/code/programname/env/lib/python3.6/site-packages/setuptools/_distutils/dist.py", line 967, in run_commands
    self.run_command(cmd)
  File "/home/biogeek/code/programname/env/lib/python3.6/site-packages/setuptools/_distutils/dist.py", line 984, in run_command
    cmd_obj = self.get_command_obj(command)
  File "/home/biogeek/code/programname/env/lib/python3.6/site-packages/setuptools/_distutils/dist.py", line 859, in get_command_obj
    cmd_obj = self.command_obj[command] = klass(self)
  File "/usr/lib/python3.6/distutils/cmd.py", line 57, in __init__
    raise TypeError("dist must be a Distribution instance")
TypeError: dist must be a Distribution instance 

编辑2

我终于使我的安装成功了。我尝试了一些事情,所以不完全确定到底是什么解决了这个问题,但是我:

  • setuptools50.0.0降级为41.0.0
  • setuptools放在我的需求文件中的第一行(参见这里)
  • 添加了一个简单的、hacky的一次性函数来指向具有名称@ url语法的zip归档文件。
代码语言:javascript
复制
def _format_requirement(req):
    if str(req.requirement) == 'git://github.com/BioGeek/tta_wrapper.git@master#egg=tta_wrapper':
        return 'tta_wrapper @ https://github.com/BioGeek/tta_wrapper/archive/v0.0.1.zip'
    return str(req.requirement)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-01 13:00:31

您只能使用佩普508 -需求。根据该标准,git://github.com/BioGeek/tta_wrapper.git@master#egg=tta_wrapper是无效的语法。

setuptools确实接受直接引用语法

代码语言:javascript
复制
tta_wrapper @ git://github.com/BioGeek/tta_wrapper.git

但是,不能将其放入requirements.txt文件中,而不能使用-e开关。后者只能采用VCS或本地文件路径,不能作为需求规范;请参阅部分

你在这里转换了不同的格式。我将检查is_editableparse_requirements()生成的ParsedRequirement对象上的标志,并相应地改变行为。您必须将需求字符串解析为URL,取出#egg=片段并将其放在前面:

代码语言:javascript
复制
from urllib.parse import urlparse

def _format_requirement(req):
    if req.is_editable:
        # parse out egg=... fragment from VCS URL
        parsed = urlparse(req.requirement)
        egg_name = parsed.fragment.partition("egg=")[-1]
        without_fragment = parsed._replace(fragment="").geturl()
        return f"{egg_name} @ {without_fragment}"
    return req.requirement

def load_requirements(fname):
    """Turn requirements.txt into a list"""
    reqs = parse_requirements(fname, session="test")
    return [_format_requirement(ir) for ir in reqs]

然后上述内容将-e git:...#egg=tta_wrapper转换为tta_wrapper @ git:...

代码语言:javascript
复制
>>> load_requirements('./requirements/dev.txt')
['tta_wrapper @ git://github.com/BioGeek/tta_wrapper.git@master', 'black==20.08b1']
票数 3
EN

Stack Overflow用户

发布于 2020-12-17 18:31:09

在我的例子中,我的需求中没有任何github链接,但是行

代码语言:javascript
复制
-r common.txt

./requirements/prod.txt中也会导致同样的错误。

我增加了一些愚蠢的条件,现在它对我有用了:

代码语言:javascript
复制
def load_requirements(filename) -> list:
    requirements = []
    try:
        with open(filename) as req:
            requirements = [line for line in req.readlines() if  line.strip() != "-r common.txt"]
    except Exception as e:
        print(e)
    return requirements
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63687990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档