2017-08-14 114 views
0

我在使用argparse從命令行調用函數時遇到問題。我只是想讓它執行腳本中定義的一個函數。使用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) 

當我試着使用的參數,我得到叫它:

錯誤,需要後續的論點:我

無論是通過什麼樣的說法。

+2

您使用命令行執行腳本的命令是什麼?腳本中的任何一個函數是否曾經調用過函數exp()或imp()?(它們似乎只是被定義的)? – gobrewers14

+0

你有兩個參數嗎? 'python script.py arg1 arg2' – user3080953

回答

1

一對夫婦的問題在這裏:

  1. 不能使用action直接調用定義的函數。但是,您可以使用action='store_true'將其設置爲布爾變量值,然後在該變量爲true(或false)時定義您的邏輯操作
  2. 您的函數have to be defined before you call them在腳本中。

這是結束了,我的工作:

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") 

此外,還要確保與---全名的前綴縮寫參數名稱。