将 Argparse 用于字典
Using Argparse for Dictionary
我想阅读视频列表中的任何一项。视频读取和显示代码如下。此代码运行良好。
import cv2
def VideoReading(vid):
cap = cv2.VideoCapture(vid)
while True:
ret, frame = cap.read()
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
由于我有大量的视频,而且我是通过命令行调用代码,所以写完整的视频名称很麻烦。所以我创建了一本字典。这里给出2的例子:
{"Video1.mp4": 1, 'Video2.mp4': 2}
现在我使用以下代码来调用使用值 1 或 2 的视频,而不是视频名称。代码如下:
def Main():
VideoFiles= ["Video1.mp4", "Video2.mp4"]
VideoFilesIndicator = [1, 2]
model_list = {}
for i in range(len(VideoFiles)):
model_list[VideoFiles[i]] = VideoFilesIndicator[i]
print(model_list)
def convertvalues(value):
return model_list.get(value, value)
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--video", help = "add video file name of any format", type = convertvalues,\
choices = [1,2], default = 1)
args =parser.parse_args()
return VideoReading(args.video)
if __name__ == "__main__":
Main()
现在,当我 运行 cmd "python VideoReading.py -v 2"
中的代码时,它向我抛出以下错误。
error: argument -v/--video: invalid choice: '2' (choose from 1, 2)
我不明白为什么会出现此错误。我正在关注 this post 来构建我的程序。
问题是 convertvalues
返回 '2'
作为字符串,因为 convertvalues
returns value
按原样(即字符串)当在 model_list
中找不到它。尝试:
def convertvalues(value):
return model_list.get(value, int(value))
此外,实际上,您的参数解析器最终总是会在 video
中收到一个整数(您传递了一个整数或 convertvalues
将视频文件名转换为整数)。要再次获取实际文件名,您可以执行
args = parser.parse_args()
video_file = VideoFiles[VideoFilesIndicator.index(args.video)]
return VideoReading(video_file)
我的建议是基于尝试对代码进行最少的更改。但是,如果您对代码的最终形式不满意,您也可以考虑对程序进行更多更改,。
你的词典倒退了;你想把一个数字映射到一个文件名,这样当你输入一个数字时,可以返回一个文件名。无需从 convertvalues
提供默认值,因为您正在使用 choices
将允许的输入限制为字典的有效键。
def main():
video_files = ["Video1.mp4", "Video2.mp4"]
model_list = dict(enumerate(video_files, start=1))
print(model_list)
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--video",
help="add video file name of any format",
type=lambda str: model_list[int(str)],
choices=model_list.values())
args = parser.parse_args()
return VideoReading(args.video)
替代解决方案,代码最少,为用户提供动态 help
输出:
import argparse
def main():
model = {
1: "Video1.mp4",
2: "Video2.mp4",
3: "Video3.mp4"
} # Add more if needed
videos = ['{}({})'.format(v, str(k)) for k, v in model.items()]
help_ = "Videos to choose from: {}".format(', '.join(videos))
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--video', help=help_, type=int, default=1)
args = parser.parse_args()
return VideoReading(model[args.video])
if __name__ == '__main__':
main()
python VideoReading.py -h
:
usage: VideoReading.py [-h] [-v VIDEO]
optional arguments:
-h, --help show this help message and exit
-v VIDEO, --v VIDEO
Videos to choose from: Video1.mp4(1), Video2.mp4(2),
Video3.mp4(3)
python VideoReading.py
:
如果您正在打印选择 - Video1.mp4
python VideoReading.py -v 3
:
如果您正在打印选择 - Video3.mp4
我想阅读视频列表中的任何一项。视频读取和显示代码如下。此代码运行良好。
import cv2
def VideoReading(vid):
cap = cv2.VideoCapture(vid)
while True:
ret, frame = cap.read()
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
由于我有大量的视频,而且我是通过命令行调用代码,所以写完整的视频名称很麻烦。所以我创建了一本字典。这里给出2的例子:
{"Video1.mp4": 1, 'Video2.mp4': 2}
现在我使用以下代码来调用使用值 1 或 2 的视频,而不是视频名称。代码如下:
def Main():
VideoFiles= ["Video1.mp4", "Video2.mp4"]
VideoFilesIndicator = [1, 2]
model_list = {}
for i in range(len(VideoFiles)):
model_list[VideoFiles[i]] = VideoFilesIndicator[i]
print(model_list)
def convertvalues(value):
return model_list.get(value, value)
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--video", help = "add video file name of any format", type = convertvalues,\
choices = [1,2], default = 1)
args =parser.parse_args()
return VideoReading(args.video)
if __name__ == "__main__":
Main()
现在,当我 运行 cmd "python VideoReading.py -v 2"
中的代码时,它向我抛出以下错误。
error: argument -v/--video: invalid choice: '2' (choose from 1, 2)
我不明白为什么会出现此错误。我正在关注 this post 来构建我的程序。
问题是 convertvalues
返回 '2'
作为字符串,因为 convertvalues
returns value
按原样(即字符串)当在 model_list
中找不到它。尝试:
def convertvalues(value):
return model_list.get(value, int(value))
此外,实际上,您的参数解析器最终总是会在 video
中收到一个整数(您传递了一个整数或 convertvalues
将视频文件名转换为整数)。要再次获取实际文件名,您可以执行
args = parser.parse_args()
video_file = VideoFiles[VideoFilesIndicator.index(args.video)]
return VideoReading(video_file)
我的建议是基于尝试对代码进行最少的更改。但是,如果您对代码的最终形式不满意,您也可以考虑对程序进行更多更改,
你的词典倒退了;你想把一个数字映射到一个文件名,这样当你输入一个数字时,可以返回一个文件名。无需从 convertvalues
提供默认值,因为您正在使用 choices
将允许的输入限制为字典的有效键。
def main():
video_files = ["Video1.mp4", "Video2.mp4"]
model_list = dict(enumerate(video_files, start=1))
print(model_list)
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--video",
help="add video file name of any format",
type=lambda str: model_list[int(str)],
choices=model_list.values())
args = parser.parse_args()
return VideoReading(args.video)
替代解决方案,代码最少,为用户提供动态 help
输出:
import argparse
def main():
model = {
1: "Video1.mp4",
2: "Video2.mp4",
3: "Video3.mp4"
} # Add more if needed
videos = ['{}({})'.format(v, str(k)) for k, v in model.items()]
help_ = "Videos to choose from: {}".format(', '.join(videos))
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--video', help=help_, type=int, default=1)
args = parser.parse_args()
return VideoReading(model[args.video])
if __name__ == '__main__':
main()
python VideoReading.py -h
:
usage: VideoReading.py [-h] [-v VIDEO]
optional arguments:
-h, --help show this help message and exit
-v VIDEO, --v VIDEO
Videos to choose from: Video1.mp4(1), Video2.mp4(2),
Video3.mp4(3)
python VideoReading.py
:
如果您正在打印选择 - Video1.mp4
python VideoReading.py -v 3
:
如果您正在打印选择 - Video3.mp4