2017-08-14 2 views
0

Ich habe Probleme beim Aufrufen von Funktionen von der Befehlszeile mit argparse. Ich möchte nur, dass es eine der im Skript definierten Funktionen ausführt.Problem beim Aufrufen von Funktionen mit argparse

import os 
import shutil 
import getpass 
import argparse 


user = getpass.getuser() 
copyfolders = ['Favorites'] 

parser = argparse.ArgumentParser() 
parser.add_argument('e', action='store') 
parser.add_argument('i', action='store') 
args = parser.parse_args() 


def exp(args): 
    for folder in copyfolders: 
     c_path = os.path.join("C:", "/", "Users", user, folder) 
     l_path = os.path.join("L:", "/", "backup", folder) 
     shutil.copytree(c_path, l_path) 

def imp(args): 
    for folder in copyfolders: 
     l_path = os.path.join("L:", "/", "backup", folder) 
     c_path = os.path.join("C:", "/", "Users", user, folder) 
     shutil.copytree(l_path, c_path) 

Wenn ich versuche, es mit einem Argument zu nennen ich:

Fehler die Folge Argumente erforderlich sind: i

Egal, was Argument übergeben wird.

+2

Welchen Befehl verwenden Sie über die Befehlszeile, um das Skript auszuführen? Wo im Skript werden die Funktionen 'exp()' oder 'imp()' jemals aufgerufen (es scheint, dass sie nur definiert sind)? – gobrewers14

+0

Haben Sie es mit zwei Argumenten versucht? 'Python script.py arg1 arg2' – user3080953

Antwort

1

Ein paar Probleme hier:

  1. Sie können nicht action verwenden eine definierte Funktion direkt aufrufen. Sie können es jedoch auf einen booleschen Variablenwert setzen, indem Sie action='store_true' verwenden und dann Ihre Logik definieren, was zu tun ist, wenn diese Variable wahr (oder falsch)
  2. Ihre Funktionen have to be defined before you call them im Skript ist.

Dies ist, was für mich arbeiten endete:

def exp(arg): 
    #replace below with your logic 
    print("in exp for %s" % arg) 

def imp(arg): 
    #replace below with your logic 
    print("in imp for %s" % arg) 

user = getpass.getuser() 
copyfolders = ['Favorites'] 

parser = argparse.ArgumentParser() 

#make sure to prefix the abbreviated argument name with - and the full name with -- 
parser.add_argument('-e', '--exp', action='store_true', required=False) 
parser.add_argument('-i', '--imp', action='store_true', required=False) 
args = parser.parse_args() 

isExp = args.exp 
isImp = args.imp 

if isExp: 
    exp("foo") 

if isImp: 
    imp("bar") 

Stellen Sie außerdem sicher, dass der abgekürzte Argument Namen mit - und dem vollständigen Namen mit -- Präfix.

Verwandte Themen