Как предотвратить сбой argparse из-за того, что он не распознает имя программы?

Я получаю сообщение об ошибке при попытке запустить некоторый код Python. Ошибка, которую я получаю, заключается в том, что argparse не распознает аргумент: имя программы.

migration.py: error: unrecognized arguments: migration.py

Команда, которую я передаю, в порядке, я считаю:

python migration.py --checkoutdir "C:\Projects\SomeDir\CodeFreeze_20131129" --publishonly

И для контекста, вот код argparse:

parser = argparse.ArgumentParser(description = 'Branch/Publish')
parser.add_argument('-c','--checkoutdir', nargs=1, required=True, help="Directory to checkout branch into, or if it exists, the directory to publish from.")    
parser.add_argument('-b','--branchonly', nargs='?', const=True, help="Only create a branch. Checkout branch into --checkoutdir")
parser.add_argument('-p','--publishonly', nargs='?', const=True, help="Only publish from --checkoutdir.")
parser.add_argument('--publishdir', nargs=1, required=False, help="Directory to output publish files", default="C:\Publish")
parser.add_argument('-g','--configuration', nargs=1, required=False, help="Publish configuration to use.")
parser.add_argument('-s','--solutionfile', nargs=1, required=False, help="Solution file in --checkoutdir used for publishing.")
parser.add_argument('-t','--targetProj', nargs=1, required=False, help="Target project to publish. Replace '.' with '_' to make msbuild happy.")

args = parser.parse_args(argv)

У меня сложилось впечатление, что argparse пропустит sys.argv[0] и будет использовать его в качестве имени программы.


person Matt R    schedule 04.12.2013    source источник


Ответы (1)


Не проходите argv вообще; если вы не передадите аргумент args в parser.parse_args(), он будет использовать sys.argv[1:], пропуская argv[0]:

args = parser.parse_args()

Из argparse исходного кода:

def parse_known_args(self, args=None, namespace=None):
    if args is None:
        # args default to the system args
        args = _sys.argv[1:]
person Martijn Pieters    schedule 04.12.2013