如何删除终端中的参数并在 argparse 中添加我自己的参数

How can I remove giving args in the terminal and add my own args inside the argparse

我想为从我的 python 程序中获取的输入创建一个目录,并将其作为参数提供给使用相同代码的 argParser。

我基本上只是想为用户输入的文件名创建一个目录,运行 这样我就可以将他的图像数据集创建到指定的文件夹中。

from imutils.video import VideoStream
import argparse
import imutils
import time
import cv2
import os

intr=input("Hello Intruder enter Your name")
print(intr)
dirpath=os.path.join('./dataset',intr)
os.mkdir(dirpath)
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--cascade", required=True,
    help = "path to where the face cascade resides")
ap.add_argument("-o", "--output","dataset/unknown", required=True,
    help="path to output directory")
args = vars(ap.parse_args())
detector = cv2.CascadeClassifier(args["cascade"])

我得到的:

(cv) ASKV:opencv-face-recognition askvyas$ python build_face_dataset.py --cascade haarcascade_frontalface_default.xml --output dataset/unknown
Hello Intruder enter Your namekiu
kiu
Traceback (most recent call last):
  File "build_face_dataset.py", line 18, in <module>
    help="path to output directory")
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/argparse.py", line 1320, in add_argument
    kwargs = self._get_optional_kwargs(*args, **kwargs)
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/argparse.py", line 1451, in _get_optional_kwargs
    raise ValueError(msg % args)
ValueError: invalid option string 'dataset/unknown': must start with a character '-'

您应该将 --output 参数设置为 "not required",并将 dirpath 设置为默认值:

ap.add_argument("-o", "--output", default=dirpath, help="path to output directory")

我是这样做的: 构建一个 class,然后如果文件是从 bash python myfile.py 调用的,请使用 argparser 更新 class。如果从另一个文件调用该命令,则会跳过 argparse 部分。

示例(请注意,我在没有输入 运行 的情况下输入此内容,因此它可能包含错字,但实际上它有效)

class ARGS:
    def __init__(self, some_str_arg="this", some_float_arg=0.7, some_int_arg=12):
        self.some_str_arg = some_str_arg
        self.some_float_arg = some_float_arg
        self.some_int_arg = some_int_arg
    def set_from_parser(self):
        # here you could get fancier and add arguments parsing the class dict, but for simplicity I duplicate tehm
        import argparse
        parser = argparse.ArgumentParser(description="Some Parser")
        parse.add_argument('--some_str_arg', default=self.some_str_arg, type=str, help='my string arg')
        parse.add_argument('--some_float_arg', default=self.some_float_arg, type=float, help='my foat arg')
        parse.add_argument('--some_int_arg', default=self.some_int_arg, type=int, help='my string arg')

        args = parser.parse_args()
        for _a in args.__dict__:
            self.__dict__[_a] = args.__dict__[_a]

def some_fun(A=None, **kwargs):
    # this you can call from python as
    # >>> some_fun(some_str_arg="cogito ergo sum", some_float_arg=1.618, some_int_arg=42)
    # or from bash as
    # $ python myfun.py --some_str_arg really --some_float_arg 3.14 --some_int_arg 0
    if A is None:
        A = ARGS()
        for kw in kwargs:
            if kw in A.__dict__:
                A.__dict__[kw] = kwargs[kw]
    ... do something

if __name__ == "__main__":
    A = ARGS()
    A.set_from_parser()
    some_fun(A)