【问题标题】:DeprecationWarning in Python 3.6 and 3.7 (with Pillow, distutils, imp)Python 3.6 和 3.7 中的 DeprecationWarning(使用 Pillow、distutils、imp)
【发布时间】:2019-04-03 02:44:54
【问题描述】:

请看这个问题:

DeprecationWarning in Python 3.6 and 3.7

  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py", line 57, in <module>
    import distutils.version
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/distutils/__init__.py", line 4, in <module>
    import imp
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/imp.py", line 33, in <module>
    DeprecationWarning, stacklevel=2)
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
The command "python -W error::DeprecationWarning manage.py test" exited with 1.

在那里发表评论的人说这是virtualenv 的问题,该问题已在virtualenv 16.3.0 中修复(请参阅 cmets)。

我尝试在测试中升级到最新的virtualenv (virtualenv==16.4.3),但在 Python 3.6 和 3.7 中使用DeprecationWarning 在启用弃用警告的情况下运行时测试仍然失败:

有什么问题?

您可以在Speedy Net的相关分支中看到代码。

例如分支uri_run_tests_with_deprecation_warnings_2019-04-02_a

更新:我了解问题是虚拟环境是在virtualenv升级之前激活的。所以激活的版本和升级后的版本是不一样的。是否可以使用最新的 virtualenv 版本在 Travis 上运行测试,还是我必须等到 Travis 升级它?

我为 setuptools 创建了一个新问题:github.com/pypa/setuptools/issues/1933

【问题讨论】:

标签: python python-3.x virtualenv travis-ci distutils


【解决方案1】:

原因:使用过时的 virtualenv 创建的虚拟环境

virtualenv 嵌入了自己的distutils

virtualenv==16.3.0 之前,嵌入的distutils 导入了已弃用的imp 模块。

Travis 使用缓存的 Python 虚拟环境,每个环境都有更新的 in-virtual-env 版本:

  • 目前virtualenv==16.6.0 用于 Python 3.6,并且
  • 目前virtualenv==16.7.8 用于 Python 3.7。

但是,虚拟环境是由 Travis Cookbooks 使用virtualenv==15.1.0 创建的。

修复:重新创建虚拟环境(使用更新的 virtualenv)

对于 Travis CI,在 cookbooks/travis_build_environment/recipes/virtualenv.rb 中:

- execute 'pip install virtualenv==15.1.0'
+ execute 'pip install virtualenv==16.3.0'

我已在travis-ci/travis-cookbooks#1065 提交了修复的 PR。

解决方法:重新安装 distutils(使用更新的 virtualenv)

对于那些不想(或不能)重新创建虚拟环境的人来说,这可能就足够了。

在深入了解 Travis CI 和 virtualenv 的源代码后,我发现您实际上可以使用更新的 in-virtual-env 版本的@987654332 在虚拟环境中安装distutils @:

before_script:
  - python -c 'import os, virtualenv; virtualenv.install_distutils(os.environ["VIRTUAL_ENV"])'
travis.yml

MCVE:

language: python
python:
  - "3.5"
  - "3.6"
  - "3.7"
os: linux
dist: bionic
install: skip
before_script:
  - python -c 'import os, virtualenv; virtualenv.install_distutils(os.environ["VIRTUAL_ENV"])'
script:
  - python -W error::DeprecationWarning -c 'import distutils'

【讨论】:

  • 感谢您的建议,但在我更改项目中的 .travis.yml 之前,我更愿意看看 Travis CI 是否会修复它。我不想在我们的项目中更改.travis.yml
  • 同意,Travis CI 应该修复它,因为他们正在为每个人造成它。
猜你喜欢
  • 2020-09-21
  • 2020-08-31
  • 2018-08-22
  • 2019-07-18
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多