2011-02-18 9 views
11

मुझे इस स्क्रिप्ट में getopt() कोड के साथ समस्याएं आ रही हैं जो मैं लिख रहा हूं जो कुछ सरल फ़ाइल मैनिपुलेशन को 2 आवश्यक पैरामीटर (इनपुट फ़ाइल नाम और आउटपुट फ़ाइल नाम) और/या 2 वैकल्पिक/स्थितित्मक तर्क (डीबग या सहायता) दिया जाता है।getopt() आवश्यक तर्क लागू नहीं कर रहा है?

कोड है:

def main(argv): 
    try: 
     opts, args = getopt.getopt(argv, "i:o:dh", ["input-file=", "output-file=", "debug", "help"]) 
    except getopt.GetoptError: 
     usage() 
     sys.exit(2) 

    for opt, arg in opts: 
     if opt in ("-h", "--help"): 
      usage() 
      sys.exit() 
     elif opt in ("-d", "--debug"): 
      global _debug 
      _debug = 1 
     elif opt in ("-i", "--input-file"): 
      u_input_file_name = arg 
     elif opt in ("-o", "--output-file"): 
      u_output_file_name = arg 

getopt() प्रलेखन के अनुसार:

विकल्प है कि एक तर्क एक कॉलन (':' पीछा आवश्यकता होती है, यानी, एक ही प्रारूप है कि यूनिक्स getopt() का उपयोग करता है)।

समस्या यह है कि के रूप में मैं इसे समझ, चर/एक : के बाद आर्ग के रूप में आवश्यक रूप से लागू किया जाना चाहिए ... लेकिन विकल्पों i और o से लागू नहीं किया जा रहा है। u_input_file_name के बारे में त्रुटि इस स्निपेट garners चल रहा है निर्धारित किये जाने से पहले संदर्भित किया जा रहा:

[[email protected] ~/python]$ ./inco_add_cm_mpscli.py -o google 
Traceback (most recent call last): 
    File "./inco_add_cm_mpscli.py", line 57, in <module> 
    main(sys.argv[1:]) 
    File "./inco_add_cm_mpscli.py", line 25, in main 
    infile = open(u_input_file_name, 'r') 
UnboundLocalError: local variable 'u_input_file_name' referenced before assignment 

क्या मैं गलत कर रहा हूँ?

उत्तर

16

एक कॉलन के बाद एक विकल्प का मतलब है कि इसे एक तर्क की आवश्यकता है। इसका मतलब यह नहीं है कि विकल्प लागू किया गया है। विकल्पों/तर्कों के अस्तित्व को लागू करने के लिए आपको अपना कोड लिखना चाहिए।

+0

परिसीमन विकल्पों में से उद्देश्य क्या है अगर ** आवश्यकता नहीं है तो ** ** एक तर्क की आवश्यकता है? –

+1

क्योंकि जब getopt() कमांड लाइन को पार्स करते हैं, तो उसे पता होना चाहिए कि टोकन पिछले विकल्प का तर्क है या यह एक नया तर्क/विकल्प है। तो आपके उदाहरण में, यह प्रकट करने के लिए -i या -o को लागू नहीं करता है, लेकिन एक बार -i या -o दिखाई देने पर, पायथन इसके तर्क के ठीक बाद टोकन का इलाज करता है। – evergreen

+0

क्या यह टोकन को या तो - या - के अनुसार लंबे या छोटे ऑप के लिए प्रीपेड के रूप में नहीं पहचानता है? –

2

बस एक नोट के रूप में, मैंने पाया argparse सरल और उपयोगी है कि getopt है, और यह आवश्यक argumennts

http://docs.python.org/2/howto/argparse.html#id1

समर्थन
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("echo", help="echo the string you use here") 
args = parser.parse_args() 

कमांड लाइन

$ python prog.py 
usage: prog.py [-h] echo 
prog.py: error: the following arguments are required: echo 
संबंधित मुद्दे