هل هناك على أي حال لإقناع GetOpt من Python للتعامل مع المعلمات الاختيارية للخيارات؟

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

سؤال

وفقا لوثائق بيثون getopt (أعتقد) يجب أن تتصرف حقول الخيارات كـ getopt() وظيفة. ومع ذلك ، لا يمكنني تمكين معلمات اختيارية من الكود الخاص بي:

#!/usr/bin/python
import sys,getopt

if __name__ == "__main__":
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
    except getopt.GetoptError, err:
        print str(err)
        sys.exit(1)

    for o,a in opts:
        if o in ("-v", "--verbose"):
            if a:
                verbose=int(a)
            else:
                verbose=1
            print "verbosity is %d" % (verbose)

النتائج في:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
هل كانت مفيدة؟

المحلول

getopt لا تدعم المعلمات الاختيارية. في حالة خيار طويل يمكنك القيام به:

$ ./testopt.py --verbose=

مما سيؤدي إلى قيمة السلسلة الفارغة.

يمكن أن تجد argparse وحدة لتكون أكثر مرونة.

نصائح أخرى

لسوء الحظ ، لا توجد طريقة. من مستندات optparse:

عادة ، يأخذ خيار معين إما وسيطة أو لا. يريد الكثير من الأشخاص ميزة "حجج الخيار الاختيارية" ، مما يعني أن بعض الخيارات ستتخذ وسيطة إذا رأوا ذلك ، ولم يفعلوا إذا لم يفعلوا ذلك. هذا أمر مثير للجدل إلى حد ما ، لأنه يجعل تحليل التحليل غامضًا: إذا كان "-a" يأخذ حجة اختيارية و "-b" هو خيار آخر تمامًا ، كيف يمكننا تفسير "-AB"؟ بسبب هذا الغموض ، لا يدعم OptParse هذه الميزة.

تعديل: عفوًا ، أي لوحدة OptParse ، وليس وحدة GetOpt ، ولكن السبب الذي يجعل السبب الذي يجعل أي وحدة من الوسائط الاختيارية "هو نفسه بالنسبة لكليهما.

يمكنك القيام بمعلمة اختيارية مع GetOpt مثل هذا:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

الاستخدام:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

إذا كنت تستخدم الإصدار 2.3 أو لاحقًا ، فقد ترغب في تجربة optparse الوحدة النمطية بدلاً من ذلك ، لأنها "أكثر ملاءمة ومرونة وقوية ..." ، وكذلك الأحدث. للأسف ، كما أجاب Pynt ، لا يبدو من الممكن الحصول على ما تريده بالضبط.

يجب أن تدعم GetOpt من Python Args اختياريًا ، مثل GNU getOpt من خلال طلب "=" عند تحديد معلمة. الآن يمكنك محاكاة ذلك بسهولة تامة ، مع هذا القيد من خلال التغيير الضمني -الاختصار إلى -الاختصار =

أي يمكنك تحديد أن -الاختصار يتطلب وسيطة ، ثم ضبط -خيار -الاختصار = على النحو التالي:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top