我编写了一个程序,并希望为用户提供在图形环境下运行它的机会。
目前通过硬编码我可以通过在导入pyplot
之前更改程序文件顶部的matplotlib导入来执行其中一项操作。
带图形环境
import matplotlib
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
...
没有图形环境
import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt
...
剩下的代码看起来像这样:
...
import os, sys, argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--noX", action="store_true", dest="noX")
params = parser.parse_args()
data = [0,1,2,3,4,5]
fig, ax = plt.subplots()
ax.plot(data)
if not params.noX:
plt.show()
plt.savefig("foo.png")
sys.exit(0)
if __name__ == "__main__":
main()
是否可以根据noX
参数值更改后端?
答案 0 :(得分:1)
您可以将后端设置为条件:
import matplotlib
if not params.noX:
matplotlib.use("agg")
else:
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
如果您只在main
内绘图,请在此功能中移动导入:
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--noX", action="store_true", dest="noX", default=False)
params = parser.parse_args()
import matplotlib
if not params.noX:
matplotlib.use("agg")
else:
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
data = [0,1,2,3,4,5]
fig, ax = plt.subplots()
ax.plot(data)
if not params.noX:
plt.show()
plt.savefig("foo.png")
sys.exit(0)
if __name__ == "__main__":
main()
如果你想在任何地方进行绘图,可以使用特殊功能来解析 命令行参数并只调用一次。
import argparse
def _parse_cmd_args():
"""Parse command line args.
"""
parser = argparse.ArgumentParser()
parser.add_argument("--noX", action="store_true", dest="noX", default=False)
params = parser.parse_args()
return params
PARAMS = _parse_cmd_args()
# Want to prevent any further call to `_parse_cmd_args()`?
# Un-comment the following line:
# del _parse_cmd_args
import matplotlib
if not PARAMS.noX:
matplotlib.use("agg")
else:
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
def main():
data = [0,1,2,3,4,5]
fig, ax = plt.subplots()
ax.plot(data)
if not PARAMS.noX:
plt.show()
plt.savefig("foo.png")
sys.exit(0)
if __name__ == "__main__":
main()
答案 1 :(得分:0)
import
的价值之前,您必须推迟决定。请注意,您可以随时随地import
。建议在文件开头{{1}},但这并不总是可行。
答案 2 :(得分:0)
好的,所以将迈克的想法与plt的全球导入相结合,我想出了类似的东西来做这个伎俩。很抱歉打扰你,它实际上比最初想象的要简单。
import os, sys, argparse
import matplotlib
matplotlib.use("agg") if "--noX" in sys.argv else matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--noX", action="store_true", dest="noX", default=False)
params = parser.parse_args()
data = [0,1,2,3,4,5]
fig, ax = plt.subplots()
ax.plot(data)
if not params.noX:
plt.show()
plt.savefig("foo.png")
sys.exit(0)
if __name__ == "__main__":
main()