كيفية قراءة/عملية سطر الأوامر الحجج ؟
-
06-07-2019 - |
سؤال
أنا أصلا مبرمج C.لقد رأيت العديد من الحيل و "الخارقة" إلى قراءة العديد من حجج مختلفة.
ما هي بعض الطرق الثعبان المبرمجين يمكن أن تفعل هذا ؟
ذات الصلة
المحلول
الحل الكنسي في المكتبة القياسية هو argparse
(مستندات):
هنا مثال:
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
args = parser.parse_args()
argparse
يدعم (من بين أمور أخرى):
- خيارات متعددة بأي ترتيب.
- خيارات قصيرة وطويلة.
- قيم افتراضية.
- إنشاء رسالة تعليمات الاستخدام.
نصائح أخرى
import sys
print("\n".join(sys.argv))
sys.argv
هي قائمة تحتوي على جميع الوسائط التي تم تمريرها إلى البرنامج النصي في سطر الأوامر.
أساسًا،
import sys
print(sys.argv[1:])
فقط حول تنصير عن argparse الذي هو أفضل بالنسبة هذه الأسباب..أساسا:
(نسخ من الرابط)
argparse وحدة يمكن التعامل مع الموضعية و وسيطات اختيارية ، في حين optparse فقط يمكن التعامل مع اختياري الحجج
argparse ليس العقائدي عن ما واجهة سطر الأوامر يجب أن تبدو الخيارات مثل الملف أو /ملف معتمدة ، كما هي الخيارات المطلوبة.Optparse يرفض دعم هذه الميزات ، وفضلت نقاء على التطبيق العملي
argparse تنتج أكثر بالمعلومات استخدام الرسائل ، بما في ذلك استخدام سطر الأوامر المحددة حججك و المساعدة في رسائل سواء الموضعية و اختياري الحجج.على optparse وحدة يتطلب منك أن تكتب الاستخدام الخاصة بك سلسلة و لا طريقة عرض مساعدة الموضعية الحجج.
argparse يدعم عمل تستهلك عدد متغير من سطر الأوامر وسائط ، في حين optparse يتطلب أن العدد الدقيق الحجج (مثلا ، 1 أو 2 أو 3) تكون معروفة مقدما
argparse يدعم موزعي أن إرسال الفرعية الأوامر ، في حين optparse يتطلب وضع
allow_interspersed_args
والقيام محلل الإرسال يدويا
و الشخصية المفضلة:
- argparse يسمح نوع
عمل المعلمات
add_argument()
أن تكون محددة مع بسيطة callables ، في حين يتطلب optparse القرصنة سمات الطبقة مثلSTORE_ACTIONS
أوCHECK_METHODS
للحصول على سليم حجة التحقق
يوجد ايضا argparse
وحدة ستدليب ("التحسين" على stdlib's optparse
وحدة).مثال من مقدمة إلى argparse:
# script.py
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'integers', metavar='int', type=int, choices=range(10),
nargs='+', help='an integer in the range 0..9')
parser.add_argument(
'--sum', dest='accumulate', action='store_const', const=sum,
default=max, help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
الاستخدام:
$ script.py 1 2 3 4
4
$ script.py --sum 1 2 3 4
10
طريقة واحدة للقيام بذلك هي استخدام sys.argv
.سيؤدي هذا إلى طباعة اسم البرنامج النصي باعتباره الوسيط الأول وجميع المعلمات الأخرى التي تمررها إليه.
import sys
for arg in sys.argv:
print arg
ال com.docopt المكتبة رائعة حقًا.يقوم ببناء وسيطة من سلسلة الاستخدام لتطبيقك.
على سبيل المثال من الملف التمهيدي docopt :
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
"""
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
إذا كنت بحاجة إلى شيء سريع وغير مرن للغاية
main.py:
import sys
first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)
ثم اركض python main.py James Smith
لإنتاج الإخراج التالي:
مرحبا جيمس سميث
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
يمكنني استخدام optparse نفسي, ولكن في الحقيقة مثل اتجاه سيمون Willison أخذ مع أدخلت مؤخرا optfunc المكتبة.وهو يعمل عن طريق:
"introspecting وظيفة تعريف (بما في ذلك الحجج و القيم الافتراضية) و باستخدام أن بناء سطر الأوامر حجة محلل."
لذا, فعلى سبيل المثال, هذا تعريف الدالة:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
تحولت إلى هذا optparse نص التعليمات:
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
أنا أحب getopt من stdlib، على سبيل المثال:
try:
opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError, err:
usage(err)
for opt, arg in opts:
if opt in ('-h', '--help'):
usage()
if len(args) != 1:
usage("specify thing...")
لقد قمت مؤخرًا بتغليف شيء مشابه لهذا لجعل الأمور أقل إسهابًا (على سبيل المثال؛جعل "-h" ضمنيًا).
كما ترون com.optparse "تم إهمال وحدة optparse ولن يتم تطويرها بشكل أكبر؛سيستمر التطوير مع argparse وحدة."
بوكو انقر أكثر سهولة، ويتطلب نموذجًا أقل، وهو على الأقل بنفس قوة argparse.
نقطة الضعف الوحيدة التي واجهتها حتى الآن هي أنه لا يمكنك إجراء الكثير من التخصيص لصفحات المساعدة، ولكن هذا ليس مطلبًا عادةً com.docopt يبدو وكأنه الاختيار الواضح عندما يكون كذلك.
قد تكون مهتمًا بوحدة Python الصغيرة التي كتبتها لتسهيل التعامل مع وسيطات سطر الأوامر (مفتوحة المصدر ومجانية الاستخدام) - كوماندوز
أوصي بالنظر com.docopt كبديل بسيط لهؤلاء الآخرين.
docopt هو مشروع جديد يعمل عن طريق تحليل رسالة استخدام --help بدلاً من مطالبتك بتنفيذ كل شيء بنفسك.عليك فقط وضع رسالة الاستخدام الخاصة بك بتنسيق POSIX.
هناك خيار آخر آرغ.إنه يعتمد على argparse، ويتيح لك كتابة أشياء مثل:
import argh
# declaring:
def echo(text):
"Returns given word as is."
return text
def greet(name, greeting='Hello'):
"Greets the user with given name. The greeting is customizable."
return greeting + ', ' + name
# assembling:
parser = argh.ArghParser()
parser.add_commands([echo, greet])
# dispatching:
if __name__ == '__main__':
parser.dispatch()
سيقوم تلقائيًا بإنشاء المساعدة وما إلى ذلك، ويمكنك استخدام أدوات الديكور لتوفير إرشادات إضافية حول كيفية عمل تحليل الوسيطات.
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Assuming the Python code above is saved into a file called prog.py
$ python prog.py -h
Ref-link: https://docs.python.org/3.3/library/argparse.html
الحل الخاص بي هو نقطة الدخول2.مثال:
from entrypoint2 import entrypoint
@entrypoint
def add(file, quiet=True):
''' This function writes report.
:param file: write report to FILE
:param quiet: don't print status messages to stdout
'''
print file,quiet
نص المساعدة:
usage: report.py [-h] [-q] [--debug] file
This function writes report.
positional arguments:
file write report to FILE
optional arguments:
-h, --help show this help message and exit
-q, --quiet don't print status messages to stdout
--debug set logging level to DEBUG