“ extras_require”必须是字典,其值是包含有效项目/版本要求说明符的字符串或字符串列表

如何解决“ extras_require”必须是字典,其值是包含有效项目/版本要求说明符的字符串或字符串列表

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

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看起来像这样:

-r common.txt

和我的./requirements/dev.txt类似,但带有一些特定于开发的软件包。我的./requirements/common.txt包含一行代码,可从github链接pip安装软件包,例如:

-e git://github.com/BioGeek/tta_wrapper.git@master#egg=tta_wrapper

但是,由于我添加了该行,因此命令python setup.py build失败,并显示以下信息:

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.

相关软件包的版本:

pip                            20.2.2
setuptools                     50.0.0

如何修改setup.py或需求文件以解决此问题?

修改

按照the anwserMartijn Pieters修改setup.py后,我可以确认load_requirements现在将需求文件转换为具有name @ url直接引用语法的列表需要的地方。

>>> 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时出现以下错误:

$ 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放入我的需求文件的第一行(请参阅here
  • 添加了一个粗俗的一次性功能,以名称@ url语法指向zip存档。
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)

解决方法

您只能使用PEP 508 - Dependency specification for Python Software Packages个要求。根据该标准,git://github.com/BioGeek/tta_wrapper.git@master#egg=tta_wrapper无效的语法。

setuptools确实接受了name@ url direct reference syntax

tta_wrapper @ git://github.com/BioGeek/tta_wrapper.git

但是您不能将其放置在requirements.txt文件中,而不是 并使用-e开关。后者只能采用VCS URL或本地文件路径,不能为需求说明;参见Requirements File Format section

因此,您可以在此处在格式之间进行翻译。我会检查is_editable产生的ParsedRequirement对象上的parse_requirements()标志,并相应地更改行为。您必须将需求字符串解析为URL,取出#egg=片段并将其放在最前面:

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:...

>>> load_requirements('./requirements/dev.txt')
['tta_wrapper @ git://github.com/BioGeek/tta_wrapper.git@master','black==20.08b1']
,

在我的情况下,我的要求中没有任何github链接,但该行

-r common.txt
./requirements/prod.txt中的

导致了相同的错误。

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

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

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

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-