سؤال

أنا أكتب شل مشروع لي وهو من تصميم يوزع الأوامر التي تبدو مثل هذا:

COMMAND_NAME ARG1="طويلة قيمة" ARG2=123 ARG3=me@me.com

مشكلتي هي أن بايثون سطر الأوامر تحليل المكتبات (getopt و optparse) يجبرني على استخدام '-' أو '--' أمام الحجج.هذا السلوك لا يطابق متطلبات بلدي.

أي أفكار كيف يمكن حلها ؟ أي مكتبة موجودة على هذا ؟

هل كانت مفيدة؟

المحلول

هل يمكن تقسيمها مع shlex.split ()، والتي يمكن التعامل مع القيم نقلت لديك، وبسهولة جدا تحليل هذا مع تعبير عادي بسيط جدا. أو، يمكنك فقط استخدام التعبيرات العادية لكل من تقسيم والتوزيع. أو ببساطة استخدام انقسام ().

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

نصائح أخرى

  1. في محاولة لمتابعة "معايير واجهات سطر الأوامر"

  2. تحويل الوسائط الخاصة بك (كما اقترح توماس) إلى OptionParser الشكل.

    parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
    

إذا وسيطات سطر الأوامر ليست في sys.argv أو قائمة مماثلة ولكن في سلسلة ثم (كما ironfroggy اقترح) استخدام shlex.split().

parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])

وهناك تباين pythonic صغير على الجواب shlex Ironforggy ل:

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

عفوا ... - تصحيح

شكرا، J.F. سيباستيان  (حصلت على تذكر تلك التعبيرات الحجة مولد واحدة).

وماذا عن optmatch ( http://www.coderazzi.net/python/optmatch /index.htm )؟ غير القياسية، ولكنه يأخذ نهجا مختلفا لخيارات التوزيع، وأنها تدعم أي اختصار:

وOptionMatcher.setMode (optionPrefix = '-')

وبدون جراحة مكثفة إلى حد ما على optparse أو getopt، وأنا لا أعتقد أنك يمكن أن تجعل معقولة منها تحليل شكل الخاص بك. يمكن تحليل بسهولة شكل خاص بك، على الرغم من أو ترجمته إلى شيء optparse يمكن التعامل مع:

parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
    parts = arg.split('=', 1)
    if len(parts) < 2:
        # End of options, don't translate the rest. 
        newargs.extend(sys.argv[idx+1:])
        break
    argname, argvalue = parts
    newargs.extend(["--%s" % argname, argvalue])

parser.parse_args(newargs)

وليتل في وقت متأخر إلى الحزب ... ولكن PEP 389 يسمح لهذا وأكثر من ذلك بكثير.

إليك مكتبة صغيرة لطيفة يجب إصدار بيثون في حاجة إليها code.google.com/p/argparse

واستمتع.

وقد تكون مهتمة في وحدة نمطية بيثون قليلا كتبت لجعل التعامل مع وسائط سطر الأوامر حتى أسهل (مفتوحة المصدر ومجانية لاستخدام) - <وأ href = "http://freshmeat.net/projects/commando" يختلط = "نوفولو"> http://freshmeat.net/projects/commando

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top