تجهيز وسائط سطر الأوامر في تدوين البادئة في بايثون
-
26-09-2019 - |
سؤال
أنا أحاول تحليل سطر الأوامر في بيثون التي تبدو كما يلي:
$ ./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 القيمة ، والتي سوف يكون اسم البرنامج النصي.
في بيثون 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]