AttributeError: 'ParsedRequirement' 对象没有属性 'req'

meh*_*ati 11 python travis-ci docker

我有一层为 docker 文件

RUN python setup.py develop
Run Code Online (Sandbox Code Playgroud)

我正在使用具有三个阶段的多阶段构建,这是所有阶段都具有相同基础映像的第一阶段,尽管我不认为这是 dockerfile 的问题,但似乎是 python 及其方式的问题在基本图像上执行python:3.7-slim 我正在 Travis CI 上构建这个 dockerfile,下面是 Travis 上的版本信息:

docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:42:38 2017
 OS/Arch:      linux/amd64
Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:41:20 2017
 OS/Arch:      linux/amd64
 Experimental: false
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

AttributeError: 'ParsedRequirement' object has no attribute 'req'
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我能够使用 docker 版本在我的 mac 机器上使用它19.03.2 这是我的setup.py文件

RUN python setup.py develop
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。

meh*_*ati 19

更新:

* 请注意,在我的情况下不支持更新 pip 和 pip-tools。那么我的答案中的解决方法会有所帮助。

* 如果支持将 pip 和 pip-tools 更新为兼容版本,请参考Gnnr 的回答Heapify 的回答

我终于得到了修复 \o/

install_reqs = parse_requirements(requirements_path, session=False)
Run Code Online (Sandbox Code Playgroud)

起初,我通过简单地记录来检查 Travis 上的 install_reqs 是什么,发现它是 ParsedRequirement 对象的列表。我还发现这个类是在req_file.py. 我已经在 GitHub 上查看了req_file.py 此处的源代码。我发现没有调用这样的属性req,而是requirement. 所以有两个版本的parse_requirements函数,所以我使用 try 和 except 块来处理这个。

# Generator must be converted to list, or we will only have one chance to read each element, meaning that the first requirement will be skipped.
requirements = list(requirements) 
try:
    requirements = [str(ir.req) for ir in install_reqs]
except:
    requirements = [str(ir.requirement) for ir in install_reqs]
Run Code Online (Sandbox Code Playgroud)

现在它与两个版本都兼容 \0/

  • 永远不要使用裸露的“ except ” - 总是捕获特定的异常(我猜是“ AttributeError ”)! (3认同)