سؤال

ما سيكون تعبيرا سهلا لمعالجة وسيطات سطر الأوامر إذا كنت أتوقع أي شيء مثل 001 أو 999 (دعنا نحد من التوقعات إلى 001 ... 999 نطاق لهذا الوقت)، وعدد قليل من الحجج الأخرى مرت، وترغب في تجاهل أي غير متوقع ب

أفهم ما إذا كان على سبيل المثال، أحتاج إلى معرفة ما إذا كان "تصحيح" تم تمريره بين المعلمات، فهذا سيكون شيئا ما:

if 'debug' in argv[1:]:
  print 'Will be running in debug mode.'

كيفية معرفة ما إذا كان 009 أو 575 مرت؟

جميع تلك المكالمات المتوقعة:

python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf

في هذه المرحلة، لا يهمني المكالمات مثل هذا:

python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02

... أول واحد - بسبب أكثر من وسيطة "رقمية"؛ ثانيا - بسبب ... حسنا، حجج غير متوقعة؛ الثالث والرابع - بسبب الحجج غير المكونة من 3 أرقام.

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

المحلول

كما أجاب الآخرون، هو الخيار الأفضل هو الخيار الأفضل، ولكن إذا كنت تريد فقط رمز سريع جرب شيئا مثل هذا:

import sys, re

first_re = re.compile(r'^\d{3}$')

if len(sys.argv) > 1:

    if first_re.match(sys.argv[1]):
        print "Primary argument is : ", sys.argv[1]
    else:
        raise ValueError("First argument should be ...")

    args = sys.argv[2:]

else:

    args = ()

# ... anywhere in code ...

if 'debug' in args:
    print 'debug flag'

if 'xls' in args:
    print 'xls flag'

تعديل: إليك مثال بضعة لأن الكثير من الناس يجيبون على غياب دون تشرح لماذا حقا، أو شرح ما يجب عليك تغييره لجعله يعمل.

السبب الرئيسي لاستخدام Opplse هو أنه يمنحك المزيد من المرونة للتوسع في وقت لاحق، ويمنحك المزيد من المرونة في سطر الأوامر. بمعنى آخر، يمكن أن تظهر خياراتك بأي ترتيب وتوليد رسائل الاستخدام تلقائيا. ومع ذلك، لجعله يعمل مع Opplse، فأنت بحاجة إلى تغيير مواصفاتك لوضع "-" أو "-" أمام الحجج الاختيارية وتحتاج إلى السماح لجميع الحجج بأن تكون بأي ترتيب.

لذلك هنا مثال على استخدام Opplse:

import sys, re, optparse

first_re = re.compile(r'^\d{3}$')

parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()

if len(args) == 1:
    if first_re.match(args[0]):
        print "Primary argument is : ", args[0]
    else:
        raise ValueError("First argument should be ...")
elif len(args) > 1:
    raise ValueError("Too many command line arguments")

if options.debug:
    print 'debug flag'

if options.xls:
    print 'xls flag'

الاختلافات هنا مع Opplse و المواصفات الخاصة بك هي أنه الآن يمكنك الحصول على خطوط الأوامر مثل:

python script.py --debug --xls 001

ويمكنك بسهولة إضافة خيارات جديدة عن طريق الاتصال parser.add_option ()

نصائح أخرى

إلقاء نظرة على Opplse. وحدة. التعامل مع sys.argv نفسك على ما يرام للأشياء البسيطة حقا، لكنه يخرج بسرعة.

لاحظ أنه قد تجد Opply أسهل في الاستخدام إذا كنت تستطيع تغيير تنسيق الوسيطة الخاص بك قليلا؛ مثل استبدال debug مع --debug و xls مع --xls أو --output=xls.

Opplse. هو أفضل صديق لك لتحليل سطر الأوامر. انظر أيضا إلى argparse.; ؛ انها ليست في المكتبة القياسية، رغم ذلك.

إذا كنت ترغب في تنفيذ مفاتيح سطر الأوامر الفعلية، تعطي getopt. نظرة. انها بسيطة بشكل لا يصدق للاستخدام، أيضا.

فان عاصفة صحيحة إلى حد كبير في استخدام التعبير العادي ضد الحجة. ومع ذلك، ليس من الضروري تماما أن تجعل كل شيء خيارا عند استخدام Opply، والذي ينقسم SYS.ArgV في خيارات ووسائط، بناء على ما إذا كان "-" أو "-" موجود في المقدمة أم لا. بعض رمز المثال للذهاب من خلال الحجج فقط:

import sys
import optparse

claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
  print "Arguments:"
  for arg in args:
    print "  " + arg
else:
  print "No arguments"
sys.exit(0)

نعم، يتم تحليل صفيف Args بنفس الطريقة التي ستكون sys.argv، ولكن القدرة على إضافة خيارات بسهولة إذا تم إضافة لزم الأمر. للحصول على المزيد حول Opplse، تحقق من وثيقة python ذات الصلة.

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