![](/img/trans.png)
[英]Passing optional number of arguments to a flag Python argparse
[英]python use argparse for passing optional arguments for plotting
我想將可選的 arguments 傳遞給從命令行運行的 matplotlib 腳本。
我有以下內容:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')
import pandas as pd
import argparse
parser = argparse.ArgumentParser(description="Plot x,y data in python")
parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
parser.add_argument('-o', "--options", nargs="+", default=[], help="Options for plotting")
args = parser.parse_args()
def plot(x, y, xlabel, ylabel, name, legend=None, otherArgs=None):
xData = pd.read_csv(x)
yData = pd.read_csv(y)
plt.figure()
plt.plot(xData, yData, label=legend, *(otherArgs), zorder=1)
plt.tight_layout()
plt.savefig("tst.tiff")
if __name__ == '__main__':
plot(args.x, args.y, args.options)
但是,目前我無法這樣做。 有沒有辦法在可選的 arguments 其他參數下傳遞給 plot 函數? 設置 colors,標記等。 ?
最好的祝福
如果你將運行
-o color=red marker=o
然后你會得到清單
["color=red", "marker=o"]
你可以使用split("=")
和dict()
args.options = dict(x.split('=') for x in args.options)
把它作為字典
{"color":"red", "marker":"o"}
然后你可以用**
來放字典
plt.plot(..., **otherArgs)
它將接受它作為正確的參數。
最小的工作代碼:
為了測試,我將 argumenst 直接放在sys.argv
中——這樣我就可以運行它而無需在控制台中寫入參數。
編輯:它需要字典default={}
而不是default=[]
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#matplotlib.use('Agg')
import pandas as pd
import argparse
# --- functions ---
def plot(x, y, xlabel='X', ylabel='Y', name='Name', legend=None, otherArgs=None):
xData = [1,2,3]
yData = [3,1,1]
plt.figure()
plt.plot(xData, yData, label=legend, **otherArgs, zorder=1)
plt.tight_layout()
#plt.savefig("tst.tiff")
plt.show()
# --- main ---
if __name__ == '__main__':
import sys
sys.argv += ['--x', '1', '--y', '2', '-o', 'color=red', 'marker=o']
parser = argparse.ArgumentParser(description="Plot x,y data in python")
parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
parser.add_argument('-o', "--options", nargs="+", default={}, help="Options for plotting") # `default={}` instead of `default=[]`
args = parser.parse_args()
print('[args.options] before:', args.options)
args.options = dict(x.split('=') for x in args.options)
print('[args.options] after :', args.options)
plot(args.x, args.y, otherArgs=args.options)
安慰:
[args.options] before: ['color=green', 'marker=o']
[args.options] after : {'color': 'green', 'marker': 'o'}
編輯:
我還找到了基於argparse.Action
創建自己的 class 的方法,然后將其分配給 add_param(..., action
add_param(..., action=...)
class keyvalue(argparse.Action):
def __call__(self, parser, namespace, values, option_string):
#print(parser)
#print(values)
#print(option_string)
print('[namespace] before:', namespace)
data = dict()
for value in values:
key, val = value.split('=')
data[key] = val
setattr(namespace, self.dest, data)
print('[namespace] after :', namespace)
parser.add_argument('-o', "--options", nargs="+", default={}, action=keyvalue)
完整的工作代碼
import argparse
import matplotlib.pyplot as plt
#matplotlib.use('Agg')
#import pandas as pd
# --- functions ---
def plot(x, y, xlabel='X', ylabel='Y', name='Name', legend=None, otherArgs=None):
xData = [1,2,3]
yData = [3,1,1]
plt.figure()
plt.plot(xData, yData, label=legend, **otherArgs, zorder=1)
plt.tight_layout()
#plt.savefig("tst.tiff")
plt.show()
class keyvalue(argparse.Action):
def __call__(self, parser, namespace, values, option_string):
#print(parser)
#print(values)
#print(option_string)
print('[namespace] before:', namespace)
data = dict()
for value in values:
key, val = value.split('=')
data[key] = val
setattr(namespace, self.dest, data)
print('[namespace] after :', namespace)
# --- main ---
if __name__ == '__main__':
import sys
sys.argv += ['--x', '1', '--y', '2', '-o', 'color=green', 'marker=o']
parser = argparse.ArgumentParser(description="Plot x,y data in python")
parser.add_argument('-xF',"--x", type=str, metavar='', required=True, help="x-Data")
parser.add_argument('-yF', "--y", type=str, metavar='', required=True, help="y-Data")
parser.add_argument('-o', "--options", nargs="+", default={}, help="Options for plotting", action=keyvalue)
args = parser.parse_args()
print('[args.options] before:', args.options)
plot(args.x, args.y, otherArgs=args.options)
來源:
官方文檔 - 在動作結束時使用自定義動作class FooAction(argparse.Action)
的示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.