سؤال

أنا أحاول تحليل سطر الأوامر في بيثون التي تبدو كما يلي:

$ ./command -o option1 arg1 -o option2 arg2 arg3

وبعبارة أخرى ، فإن الأمر يأخذ عدد غير محدود من الحجج و كل حجة قد يكون اختياريا سبق مع -o هذا الخيار ، والتي تتعلق على وجه التحديد إلى أن الحجة.أعتقد أن هذا يسمى "تدوين البادئة".

في Bourne shell أود أن تفعل شيئا من هذا القبيل ما يلي:

while test -n "$1"
do
    if test "$1" = '-o'
    then
        option="$2"
        shift 2
    fi
    # Work with $1 (the argument) and $option (the option)
    # ...
    shift
done

ونظروا حولهم في الدروس باش, الخ.هذا ويبدو أن قبول لغة, لذلك أنا التخمين باش هو الأمثل للعمل مع وسيطات سطر الأوامر هذا الطريق.

محاولة تنفيذ هذا النمط في بيثون ، تخميني الأول هو استخدام pop(), هذا هو الأساس كومة العملية.ولكن أعتقد أن هذا لن تعمل كذلك على الثعبان لأن قائمة من الحجج في sys.argv هو أمر خاطئ ولا بد من معالجة مثل طابور (أيالبوب من اليسار).لقد قرأت أن القوائم ليست الأمثل لاستخدامها في طوابير في بيثون.

لذا أفكاري:تحويل argv إلى collections.deque واستخدام popleft(), عكس argv باستخدام reverse() واستخدام pop(), أو ربما العمل مع الباحث قائمة المؤشرات نفسها.

لا أحد يعرف من هي أفضل طريقة للقيام بذلك, وإلا والتي من أفكاري سيكون أفضل ممارسة في الثعبان ؟

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

المحلول

آخر stdlib وحدة: argparse

p = argparse.ArgumentParser()
p.add_argument('-o', action='append')
for i in range(1, 4): p.add_argument('arg%d' % i)
args = p.parse_args('-o option1 arg1 -o option2 arg2 arg3'.split())
print args
# -> Namespace(arg1='arg1', arg2='arg2', arg3='arg3', o=['option1', 'option2'])

نصائح أخرى

يمكنك أن تفعل

argv.pop(0)

الذي ينطلق العنصر الأول ثم يعود.وهذا ربما غير فعالة ، على الرغم من.ربما.لست متأكدا كيف argv يتم تنفيذها تحت غطاء محرك السيارة.(ثم مرة أخرى, إذا كفاءة أن المهم, لماذا تستخدم الثعبان؟)

أكثر Pythonic الحل ، على الرغم من أن يكون تكرار خلال قائمة بدون ظهرت العناصر.مثل ذلك:

o_flag = False
for a in argv:
    if a == '-o':
        o_flag = True
        continue
    # do whatever
    o_flag = False

أعتقد أيضا optparse وحدة تستحق أذكر ؛ انها جميلة القياسية للتعامل مع الخيارات والحجج في بيثون البرامج ، على الرغم من أنه قد يكون مبالغة لهذه المهمة منذ كنت بالفعل عدة تماما الحلول الفنية.

الثعبان المكافئ الوظيفي "التحول" في بورن/باش يمكن أن يكون عن طريق استيراد sys ثم تعيين sys.argv[1:] إلى متغير مثلا"وسائط".ثم يمكنك استخدام وسائط = args[1:] إلى اليسار مرة واحدة, أو استخدام عدد أكبر لتحويل عدة مرات.الحجة مؤشر تبدأ من 0 بدلا من 1.المثال أعلاه يمكن أن ننظر نظرة مثل:

import sys
args = sys.argv[1:]
while len(args):
    if args[0] == '-o':
        option = args[1]
        args = args[2:] # shift 2
    # Work with args[0] (the argument) and option (the option)
    # ...
    args = args[1:] # shift

شيء من هذا القبيل:

for arg in sys.argv[1:]:
  # do something with arg

يجب أن تعمل جيدا بالنسبة لك.إلا إذا كنت تتوقع عدد كبير جدا من الحجج ، وأود أن تذهب لأي رمز هو الأكثر بسيطة (و لا تقلق كثيرا حول الأداء).Argv[1:] يتجاهل أن أول argv القيمة ، والتي سوف يكون اسم البرنامج النصي.

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

في بيثون del sys.argv[1] لا نفس العملية كما shift في bash.في بيثون sys.argv هي قائمة.حذف عنصر على مؤشر 1 هو نفس shift في bash.

أدناه نموذج بيثون السيناريو سوف تساعد على تخطي -o في الجدل والنظر في جميع الحجج الأخرى.

#!/usr/bin/python
import sys

if __name__ == '__main__':
    while len(sys.argv) > 1:
        if sys.argv[1] != "-o":
            print sys.argv[1]
        del sys.argv[1]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top