在其他导入与pep8冲突之前需要matplotlib.use。忽略还是修复?

时间:2016-09-03 10:20:19

标签: python matplotlib pep8

我有一个像这样开始的pythonscript:

#!/usr/bin/env python
import matplotlib
matplotlib.use("Agg")

from matplotlib.dates import strpdate2num
import numpy as np
import pylab as pl
from cmath import rect, phase

它就像一个魅力,但我的编辑抱怨:E402 module level import not at top of file [pep8]

如果我将matplotlib.use("Agg")向下移动,脚本将无效。

我应该忽略错误吗?或者有办法解决这个问题吗?

编辑:我知道PEP8说这只是一个建议而且可能会被忽略,但我希望在不破坏PEP8指导原则的情况下有一个很好的方法来初始化模块,因为我认为我不能让我的编辑器在每个文件的基础上忽略这个规则。

EDIT2:我正在使用带有linter-pylama的Atom

3 个答案:

答案 0 :(得分:8)

显然,matplotlib现在有一个switch_backend()功能:

import matplotlib.pyplot
# import other modules
matplotlib.pyplot.switch_backend('Agg')

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.switch_backend

但要注意,你冒着爆炸的风险:

  

切换默认后端。此功能仅为实验性功能   期望切换到图像后端。例如,如果你有   要从交互式运行的一堆PostScript脚本   在ipython会话中,您可能希望之前切换到PS后端   运行它们以避免弹出一堆GUI窗口。如果你试试   要以交互方式从一个GUI后端切换到另一个GUI后端   爆炸。

     

调用此命令将关闭所有打开的窗口。

matplotlib 1.3.1而言,它很适合我,但不适用于1.0.0。

答案 1 :(得分:3)

解决方案取决于正在使用的linter

就我而言,我正在使用pylama

linter的手册建议将# noqa添加到包含您要抑制的错误的行的末尾。

其他短绒可能有不同的机制。

答案 2 :(得分:1)

另一个不太好的解决方案,但是我为matplotlib 1.0.0的环境暂时部署的解决方案是使用包装模块。

matplotlib_agg.py

import matplotlib
matplotlib.use('Agg')

在其他档案中:

import matplotlib_agg
# other imports

不确定这是否值得。我宁愿在编辑器中忽略它;但我无法得到我使用的那个(PyCharm)忽略这一特定违反PEP8 E402的行为。