কমান্ড লাইন যুক্তি পার্স করার সর্বোত্তম উপায় কোনটি? [বন্ধ]


250

কি সবচেয়ে সহজ পদ্ধিতি হল , tersest , এবং অধিকাংশ নমনীয় পদ্ধতি বা পাইথন কমান্ড লাইন আর্গুমেন্ট পার্স জন্য লাইব্রেরী?

উত্তর:


183

এই উত্তরটি সূচিত করে optparseযা পুরানো পাইথন সংস্করণগুলির জন্য উপযুক্ত। পাইথন ২.7 এবং তদূর্ধ্বের জন্য, argparseপ্রতিস্থাপন করে optparse। আরও তথ্যের জন্য এই উত্তর দেখুন ।

অন্যান্য লোকেরা যেমন উল্লেখ করেছে, আপনি গিওপ্টের চেয়ে অপ্টপার্স নিয়ে যাওয়াই ভাল। গেটপট হ'ল স্ট্যান্ডার্ড গেওপ্ট (3) সি লাইব্রেরি ফাংশনগুলির এক থেকে এক ম্যাপিং, এবং এটি ব্যবহার করা খুব সহজ নয়।

অপ্টপার্স, যদিও আরও কিছুটা ভার্বোজ হয়ে গেছে, পরবর্তীকালে প্রসারিত করার জন্য এটি আরও ভাল কাঠামোগত এবং সহজ।

আপনার পার্সারে একটি বিকল্প যুক্ত করতে এখানে একটি সাধারণ লাইন রয়েছে:

parser.add_option('-q', '--query',
            action="store", dest="query",
            help="query string", default="spam")

এটি নিজের পক্ষে কথা বলছে; প্রসেসিংয়ের সময়, এটি বিকল্প হিসাবে -q বা - প্রশ্নকে গ্রহণ করবে, যুক্তিটি কোয়েরি বলে একটি বৈশিষ্ট্যে সংরক্ষণ করবে এবং যদি আপনি এটি নির্দিষ্ট না করেন তবে একটি ডিফল্ট মান থাকে। এটি স্ব-ডকুমেন্টিংয়েও রয়েছে যে আপনি সাহায্যের যুক্তিটি ঘোষণা করেন (যা -h / - সাহায্যের সাথে চালানোর সময় ব্যবহৃত হবে) ঠিক সেখানে বিকল্পটি রয়েছে।

সাধারণত আপনি আপনার যুক্তিগুলি এর সাথে পার্স করুন:

options, args = parser.parse_args()

এটি, ডিফল্টরূপে, স্ক্রিপ্টে পাস করা স্ট্যান্ডার্ড আর্গুমেন্টগুলি (পার্সোনাল সার্ভিস। আরজিভি [1:]) পার্স করবে

অপশন.কিউরিটি তখন আপনি স্ক্রিপ্টে যে মানটি দিয়েছিলেন সেট করে সেট করা হবে।

আপনি কেবল পার্সার তৈরি করেন

parser = optparse.OptionParser()

এগুলি আপনার প্রয়োজনীয় সমস্ত বেসিক। এখানে একটি সম্পূর্ণ পাইথন স্ক্রিপ্ট যা এটি দেখায়:

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

পাইথনের 5 টি লাইন যা আপনাকে বেসিকগুলি দেখায়।

এটিকে নমুনা.পিতে সংরক্ষণ করুন এবং একবার দিয়ে এটি চালান

python sample.py

এবং একবার সঙ্গে

python sample.py --query myquery

এর বাইরে, আপনি দেখতে পাবেন যে অপ্ট পার্সিকে প্রসারিত করা খুব সহজ। আমার একটি প্রকল্পে, আমি একটি কমান্ড ক্লাস তৈরি করেছি যা আপনাকে একটি কমান্ড ট্রিতে সহজেই সাবকম্যান্ডগুলি বাসাতে দেয়। এটি এক সাথে শৃঙ্খলাবদ্ধ কমান্ডগুলিতে অপ্টপারস ভারী ব্যবহার করে। এটি এমন কিছু নয় যা আমি কয়েকটি লাইনে সহজেই ব্যাখ্যা করতে পারি না, তবে মূল শ্রেণীর জন্য আমার সংগ্রহশালার পাশাপাশি এটিকে ব্যবহার করে এমন একটি শ্রেণি এবং অপশন পার্সার নির্বিঘ্নে নির্দ্বিধায় অনুভব করতে পারি


9
এই উত্তরটি আশ্চর্যজনকভাবে পরিষ্কার এবং অনুসরণ করা সহজ - অজগর ২.৩ থেকে ২.6 এর জন্য। পাইথন ২.7++ এর পক্ষে এটি সেরা উত্তর নয় কারণ আরগপার্স এখন স্ট্যান্ডার্ড লাইব্রেরির অংশ এবং অপ্টপার্স হ্রাস পেয়েছে।
ম্যাট উইলকি

আমার ক্ষেত্রে, আমি আস্তে আস্তে সনাক্ত করতে আমার অ্যাপ্লিকেশনটি প্রোফাইল করতে চাই। [টুনা] নামে একটি অন্য সরঞ্জাম রয়েছে ( github.com/nschloe/tuna ) যা আমাকে কেবল অ্যাগ্রার যোগ করে পুরো অ্যাপ্লিকেশনটি প্রোফাইল করার অনুমতি দেয় -mcProfile -o program.profতবে এগ্রপার্সার এই আর্গগুলি ক্যাপচার করছে, আমি কীভাবে এই অরগানগুলিকে পাইথন এক্সে পাস করব ???
যোগেশ্বর

231

argparseযাবার উপায় এটি কীভাবে ব্যবহার করবেন তার একটি সংক্ষিপ্তসার এখানে দেওয়া হল:

1) সূচনা

import argparse

# Instantiate the parser
parser = argparse.ArgumentParser(description='Optional app description')

2) যুক্তি যুক্ত করুন

# Required positional argument
parser.add_argument('pos_arg', type=int,
                    help='A required integer positional argument')

# Optional positional argument
parser.add_argument('opt_pos_arg', type=int, nargs='?',
                    help='An optional integer positional argument')

# Optional argument
parser.add_argument('--opt_arg', type=int,
                    help='An optional integer argument')

# Switch
parser.add_argument('--switch', action='store_true',
                    help='A boolean switch')

3) পার্স

args = parser.parse_args()

4) অ্যাক্সেস

print("Argument values:")
print(args.pos_arg)
print(args.opt_pos_arg)
print(args.opt_arg)
print(args.switch)

5) মান পরীক্ষা করুন

if args.pos_arg > 10:
    parser.error("pos_arg cannot be larger than 10")

ব্যবহার

সঠিক ব্যবহার:

$ ./app 1 2 --opt_arg 3 --switch

Argument values:
1
2
3
True

ভুল যুক্তি:

$ ./app foo 2 --opt_arg 3 --switch
usage: convert [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
app: error: argument pos_arg: invalid int value: 'foo'

$ ./app 11 2 --opt_arg 3
Argument values:
11
2
3
False
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
convert: error: pos_arg cannot be larger than 10

সম্পূর্ণ সহায়তা:

$ ./app -h

usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]

Optional app description

positional arguments:
  pos_arg            A required integer positional argument
  opt_pos_arg        An optional integer positional argument

optional arguments:
  -h, --help         show this help message and exit
  --opt_arg OPT_ARG  An optional integer argument
  --switch           A boolean switch

10
এটি খুব সংক্ষিপ্ত এবং দরকারী এবং এখানে সরকারী দস্তাবেজ (সুবিধার জন্য): docs.python.org/3/library/argparse.html
ক্রিস্টোফ রাউসি

1
আপনি যদি আরগপার্স খুঁজে পান তবে তার পরিবর্তে খুব ভার্জোজ প্ল্যাক ব্যবহার করুন।
নিমিটজ 14

76

ডকপ্ট ব্যবহার করা হচ্ছে

২০১২ সাল থেকে ডকপট নামক যুক্তি পার্সিংয়ের জন্য খুব সহজ, শক্তিশালী এবং সত্যই শীতল মডিউল রয়েছে । এখানে এর দস্তাবেজ থেকে নেওয়া একটি উদাহরণ:

"""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)

তাই এই এটি হল: কোডের 2 লাইন প্লাস আপনার ডক স্ট্রিংটি হয় অপরিহার্য এবং আপনি পেতে আপনার আর্গুমেন্ট পার্স এবং আপনার আর্গুমেন্ট বস্তু পাওয়া যায়।

পাইথন-ফায়ার ব্যবহার করা

2017 সাল থেকে পাইথন-ফায়ার নামে আরও একটি দুর্দান্ত মডিউল রয়েছে । এটি আপনার শূন্য আর্গুমেন্ট পার্সিংয়ের সাথে আপনার কোডের জন্য একটি সিএলআই ইন্টারফেস তৈরি করতে পারে। এখানে ডকুমেন্টেশন থেকে একটি সাধারণ উদাহরণ দেওয়া হয়েছে (এই ছোট প্রোগ্রামটি doubleকমান্ড লাইনে ফাংশনটি প্রকাশ করে ):

import fire

class Calculator(object):

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

কমান্ড লাইন থেকে, আপনি চালাতে পারেন:

> calculator.py double 10
20
> calculator.py double --number=15
30

4
ডকপট কীভাবে "ইনস্টলেশন দরকার নেই"? এটি একটি অজগর মডিউল তাই এটি ইনস্টল করতে হবে না। 'আমদানি ত্রুটি: ডকোপ্ট নামে কোনও মডিউল নেই'
আগ্রহী

1
@ এটি নিশ্চিতভাবে অজগরটির সাথে এটি অন্তর্ভুক্ত নয় তবে এটি ইনস্টল করার দরকার নেই: "আপনি কেবলমাত্র ডকপট.পি ফাইলটি আপনার প্রকল্পের মধ্যে ফেলে দিতে পারেন - এটি স্বয়ংসম্পূর্ণ" - github.com/docopt/docopt
ndemou

9
আমাদের কেবল ইনস্টলের বিভিন্ন সংজ্ঞা রয়েছে - এবং আমি ভবিষ্যতের পাঠকদের জন্য এটি উল্লেখ করতে চেয়েছিলাম।
আগ্রহী

1
@keen আমি আপনার সংজ্ঞাটি ভাগ করে নেওয়ার লোকেদের জন্য "কোনও ইনস্টলেশন নেই" -এ একটি নোট যুক্ত করেছি :-)
এনডেমো

39

নতুন হিপ উপায় argparseজন্য এই কারণে। argparse> optparse> getopt

আপডেট: পাই 2.7 হিসাবে আরগপারস স্ট্যান্ডার্ড লাইব্রেরির অংশ এবং অপ্টপার্স হ্রাস করা হয়েছে।


আপনার মূল লিঙ্কটি 404 তাই আমি এটির সাথে একই বিষয়টিকে সম্বোধন করে এমন একটি প্রশ্নের লিঙ্ক দিয়ে প্রতিস্থাপন করেছি।
জো হোলোয়

28

আমি ক্লিক পছন্দ । এটি ম্যানেজিং অপশনগুলি বিমূর্ত করে এবং "(...) প্রয়োজনীয় কম ছোট কোডের সাথে একটি কমপোজযোগ্য উপায়ে সুন্দর কমান্ড লাইন ইন্টারফেস তৈরি করতে দেয়"।

এখানে ব্যবহারের উদাহরণ:

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()

এটি স্বয়ংক্রিয়ভাবে সুন্দর বিন্যাসিত সহায়তা পৃষ্ঠা তৈরি করে:

$ python hello.py --help
Usage: hello.py [OPTIONS]

  Simple program that greets NAME for a total of COUNT times.

Options:
  --count INTEGER  Number of greetings.
  --name TEXT      The person to greet.
  --help           Show this message and exit.

14

খুব সুন্দর সবাই প্রত্যাহার ব্যবহার করছে

এখানে নথির উদাহরণ কোডটি রয়েছে:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a

সুতরাং এক কথায়, এখানে এটি কীভাবে কাজ করে তা।

আপনার কাছে দুটি ধরণের বিকল্প রয়েছে। যাঁরা যুক্তি গ্রহণ করছেন, এবং যাঁরা ঠিক সুইচের মতো।

sys.argvchar** argvসি এর মতো আপনার সি এর মতো আপনি প্রথম উপাদানটি এড়িয়ে যান যা আপনার প্রোগ্রামের নাম এবং কেবলমাত্র যুক্তিগুলি বিশ্লেষণ করে:sys.argv[1:]

Getopt.getopt আপনি যুক্তি অনুসারে যে নিয়ম দিয়েছেন তা অনুসারে এটিকে বিশ্লেষণ করবে।

"ho:v"এখানে সংক্ষিপ্ত আর্গুমেন্ট বর্ণনা -ONELETTER:মানে যে-o একটি আর্গুমেন্ট গ্রহণ করে।

শেষ পর্যন্ত ["help", "output="]দীর্ঘ আর্গুমেন্ট ( --MORETHANONELETTER) বর্ণনা করে । দ্য=আউটপুট পর আবার আউটপুট এক আর্গুমেন্ট গ্রহণ মানে।

ফলাফলটি দম্পতির একটি তালিকা (বিকল্প, যুক্তি)

যদি কোনও বিকল্প কোনও যুক্তি গ্রহণ করে না (যেমন --helpএখানে)arg অংশটি খালি স্ট্রিং। তারপরে আপনি সাধারণত এই তালিকায় লুপ করতে এবং উদাহরণ হিসাবে যেমন বিকল্পের নামটি পরীক্ষা করতে চান।

আমি আশা করি এটি আপনাকে সাহায্য করেছে


6
এর থামিয়ে দেওয়া সঙ্গে getoptপাইথন এর নতুন সংস্করণে এই উত্তর তারিখ সর্বস্বান্ত আউট হয়েছে।
শাটল 87

1
@ শাটল ৮87 অজগর ৩..7.২ অনুসারে getoptএখনও অবচয় করা হয়নি ... তবে এর নথিতে বলা হয়েছে যে এটি মূলত সি getopt()ফাংশনের সাথে পরিচিত ব্যবহারকারীদের জন্য সরবরাহ করা হয়েছে , এবং স্বীকার করে যে অন্যান্য ব্যবহারকারীর পক্ষে argparseএটি একটি আরও ভাল সমাধান হতে পারে, "কম কোড লিখতে এবং পাওয়ার অনুমতি দেয়" আরও ভাল সহায়তা এবং ত্রুটির বার্তা "।
স্কিপি লে গ্র্যান্ড গৌরু

14

ব্যবহার করুন optparseযা স্ট্যান্ডার্ড লাইব্রেরির সাথে আসে। উদাহরণ স্বরূপ:

#!/usr/bin/env python
import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', default="world")
  options, arguments = p.parse_args()
  print 'Hello %s' % options.person

if __name__ == '__main__':
  main()

উত্স: ইউনিক্স কমান্ড লাইন সরঞ্জাম তৈরি করতে পাইথন ব্যবহার করা

তবে পাইথন ২.7 হিসাবে অপ্টপার্সিকে হ্রাস করা হয়েছে, দেখুন: কেন অপ্ট পার্সির চেয়ে আরগপার্স ব্যবহার করবেন?


6

আপনার যদি প্রয়োজন হতে পারে তবে উইন 32 (2 কে, এক্সপি ইত্যাদি) এ ইউনিকোড আর্গুমেন্টগুলি ধরতে হলে এটি সাহায্য করতে পারে :


from ctypes import *

def wmain(argc, argv):
    print argc
    for i in argv:
        print i
    return 0

def startup():
    size = c_int()
    ptr = windll.shell32.CommandLineToArgvW(windll.kernel32.GetCommandLineW(), byref(size))
    ref = c_wchar_p * size.value
    raw = ref.from_address(ptr)
    args = [arg for arg in raw]
    windll.kernel32.LocalFree(ptr)
    exit(wmain(len(args), args))
startup()

ধন্যবাদ. এই স্ক্রিপ্টটি আমাকে জিভিএম-তে স্টার্টআপ কমান্ডগুলি পাস করার সময় আমার কিছু জটিল জটিল উদ্ধৃতি দিয়ে কাজ করতে সহায়তা করেছিল।
টেলোটোরিয়ামিয়াম

6

লাইটওয়েট কমান্ড লাইন যুক্তি ডিফল্ট

যদিও argparseদুর্দান্ত এবং সম্পূর্ণ নথিভুক্ত কমান্ড লাইন সুইচ এবং উন্নত বৈশিষ্ট্যগুলির সঠিক উত্তর, আপনি খুব সহজভাবে সরল অবস্থানগত আর্গুমেন্টগুলি পরিচালনা করতে ফাংশন আর্গুমেন্ট ডিফল্ট ব্যবহার করতে পারেন।

import sys

def get_args(name='default', first='a', second=2):
    return first, int(second)

first, second = get_args(*sys.argv)
print first, second

'নাম' যুক্তিটি স্ক্রিপ্টের নাম ক্যাপচার করে এবং ব্যবহৃত হয় না। পরীক্ষার আউটপুটটি এর মতো দেখাচ্ছে:

> ./test.py
a 2
> ./test.py A
A 2
> ./test.py A 20
A 20

সরল স্ক্রিপ্টগুলির জন্য যেখানে আমি কিছু ডিফল্ট মান চাই, আমি এটি যথেষ্ট পরিমাণে খুঁজে পাই। আপনি রিটার্ন মানগুলিতে কিছু ধরণের জবরদস্তি অন্তর্ভুক্ত করতে চাইতে পারেন বা কমান্ড লাইনের মানগুলি স্ট্রিং হবে।


2
ডিএফ স্টেটমেন্টে কোট মিলছে না।
হিস্ট্রিস্ট্যাম্প

3

আমি getopt থেকে optparse পছন্দ। এটি অত্যন্ত ঘোষণামূলক: আপনি এটির বিকল্পগুলি এবং তাদের প্রভাবগুলির নামগুলি উল্লেখ করুন (উদাহরণস্বরূপ, বুলিয়ান ক্ষেত্র নির্ধারণ), এবং এটি আপনাকে আপনার স্পেসিফিকেশন অনুসারে জনবহুল একটি অভিধান ফিরিয়ে দেয়।

http://docs.python.org/lib/module-optparse.html


3

আমি মনে করি বৃহত্তর প্রকল্পগুলির জন্য সর্বোত্তম উপায় হ'ল অপ্ট পার্স, তবে আপনি যদি কোনও সহজ উপায় সন্ধান করেন তবে সম্ভবত http://werkzeug.pocoo.org/docamentation/script আপনার জন্য কিছু।

from werkzeug import script

# actions go here
def action_foo(name=""):
    """action foo does foo"""
    pass

def action_bar(id=0, title="default title"):
    """action bar does bar"""
    pass

if __name__ == '__main__':
    script.run()

সুতরাং মূলত প্রতিটি ফাংশন অ্যাকশন_ * কমান্ড লাইনের সামনে প্রকাশিত হয় এবং একটি দুর্দান্ত সহায়তা বার্তা নিখরচায় উত্পন্ন হয়।

python foo.py 
usage: foo.py <action> [<options>]
       foo.py --help

actions:
  bar:
    action bar does bar

    --id                          integer   0
    --title                       string    default title

  foo:
    action foo does foo

    --name                        string

আমি স্বয়ংক্রিয় আর্গুমেন্ট সৃষ্টি ব্যবহার একটি ছোট প্যাকেজ তৈরি করেছি: declarative_parser। অবশ্যই, যদি এক werkzeug সঙ্গে কাজ করছে, এটা ভাল রাখা হতে পারে werkzung.script। যাইহোক, আমি এই জাতীয় পদ্ধতির একটি বিশাল অনুরাগী।
ক্র্যাসসস্কি

3

আরগপার্স কোডটি বাস্তব প্রয়োগের কোডের চেয়ে দীর্ঘতর হতে পারে!

এই সমস্যাটি আমি সর্বাধিক জনপ্রিয় আর্গুমেন্ট পার্সিং বিকল্পগুলির সাথে দেখতে পাই তা হ'ল যদি আপনার পরামিতিগুলি কেবলমাত্র বিনয়ী হয় তবে তাদের নথির কোডটি তাদের সরবরাহিত সুবিধার তুলনায় অস্বাভাবিকভাবে বড় হয়ে যায়।

যুক্তি পার্সিংয়ের দৃশ্যে একটি আপেক্ষিক নতুন আগত ব্যক্তি (আমার মনে হয়) প্ল্যাক

এটি আরগপার্সের সাথে কিছু স্বীকৃত ট্রেড-অফ করে, তবে ইনলাইন ডকুমেন্টেশন এবং কেবল main()টাইপ ফাংশন ফাংশন জুড়ে মোড়ক ব্যবহার করে:

def main(excel_file_path: "Path to input training file.",
     excel_sheet_name:"Name of the excel sheet containing training data including columns 'Label' and 'Description'.",
     existing_model_path: "Path to an existing model to refine."=None,
     batch_size_start: "The smallest size of any minibatch."=10.,
     batch_size_stop:  "The largest size of any minibatch."=250.,
     batch_size_step:  "The step for increase in minibatch size."=1.002,
     batch_test_steps: "Flag.  If True, show minibatch steps."=False):
"Train a Spacy (http://spacy.io/) text classification model with gold document and label data until the model nears convergence (LOSS < 0.5)."

    pass # Implementation code goes here!

if __name__ == '__main__':
    import plac; plac.call(main)

তথ্যের বিন্দু: প্ল্যাকের সর্বাধিক ব্যবহার (উদাহরণ হিসাবে দেখানো হয়েছে) কেবল পাইথন 3.x এর জন্য, কারণ এতে 3.x ফাংশন টিকা রয়েছে।
বার্নি

1

কনসোলেগগুলি এখানে উল্লেখ করার যোগ্য। এটা ব্যবহার করা খুব সহজ। এটা দেখ:

from consoleargs import command

@command
def main(url, name=None):
  """
  :param url: Remote URL 
  :param name: File name
  """
  print """Downloading url '%r' into file '%r'""" % (url, name)

if __name__ == '__main__':
  main()

এখন কনসোলে:

% python demo.py --help
Usage: demo.py URL [OPTIONS]

URL:    Remote URL 

Options:
    --name -n   File name

% python demo.py http://www.google.com/
Downloading url ''http://www.google.com/'' into file 'None'

% python demo.py http://www.google.com/ --name=index.html
Downloading url ''http://www.google.com/'' into file ''index.html''

আমি একই পদ্ধতির ব্যবহার করেছি ঘোষণামূলক-পার্সার দেখুন আর্গুমেন্ট সিদ্ধান্তগ্রহণ (টাইপিং, docstrings, kwargs) ডক্সে। প্রধান পার্থক্য: পাইথন 3, টাইপ ইঙ্গিত, পাইপ-ইনস্টলযোগ্য।
ক্র্যাসসস্কি

1
2012 সালে শেষ প্রতিশ্রুতিবদ্ধ
বরিস

0

এখানে একটি পদ্ধতি রয়েছে, একটি লাইব্রেরি নয়, যা আমার পক্ষে কাজ করে বলে মনে হচ্ছে।

এখানে লক্ষ্যগুলি সংশ্লেষিত হতে হবে, প্রতিটি যুক্তি একটি একক লাইন দ্বারা পার্স করা হয়, পাঠযোগ্যতার জন্য আর্কস লাইন করে দেয়, কোডটি সহজ এবং কোনও বিশেষ মডিউল (কেবলমাত্র ওএস + সিএস) এর উপর নির্ভর করে না, অনুপস্থিত বা অজানা আর্গুমেন্ট সম্পর্কে গ্রেফতার করে সতর্ক করে দেয় , / রেঞ্জ () লুপের জন্য একটি সাধারণ ব্যবহার করুন এবং অজগর ২.x এবং 3.x জুড়ে কাজ করে

দুটি টগল পতাকা (-d, -v) এবং আর্গুমেন্ট (-i xxx এবং -o xxx) দ্বারা নিয়ন্ত্রিত দুটি মান দেখানো হয়েছে।

import os,sys

def HelpAndExit():
    print("<<your help output goes here>>")
    sys.exit(1)

def Fatal(msg):
    sys.stderr.write("%s: %s\n" % (os.path.basename(sys.argv[0]), msg))
    sys.exit(1)

def NextArg(i):
    '''Return the next command line argument (if there is one)'''
    if ((i+1) >= len(sys.argv)):
        Fatal("'%s' expected an argument" % sys.argv[i])
    return(1, sys.argv[i+1])

### MAIN
if __name__=='__main__':

    verbose = 0
    debug   = 0
    infile  = "infile"
    outfile = "outfile"

    # Parse command line
    skip = 0
    for i in range(1, len(sys.argv)):
        if not skip:
            if   sys.argv[i][:2] == "-d": debug ^= 1
            elif sys.argv[i][:2] == "-v": verbose ^= 1
            elif sys.argv[i][:2] == "-i": (skip,infile)  = NextArg(i)
            elif sys.argv[i][:2] == "-o": (skip,outfile) = NextArg(i)
            elif sys.argv[i][:2] == "-h": HelpAndExit()
            elif sys.argv[i][:1] == "-":  Fatal("'%s' unknown argument" % sys.argv[i])
            else:                         Fatal("'%s' unexpected" % sys.argv[i])
        else: skip = 0

    print("%d,%d,%s,%s" % (debug,verbose,infile,outfile))

NextArg () এর লক্ষ্য হ'ল নিখোঁজ হওয়া ডেটাগুলি পরীক্ষা করার সময় পরবর্তী যুক্তিটি ফিরিয়ে আনা, এবং NextArg () ব্যবহার করার সময় লুপটি এড়িয়ে যায়, পতাকাটিকে একটি রেখায় পার্স করে রেখে।


0

প্রয়োজনীয় অবস্থানগত যুক্তি এবং forচ্ছিক আর্গুমেন্টের অনুমতি দেওয়ার জন্য আমি এর্কোর পদ্ধতির প্রসারিত করেছি। এগুলি -d, -v ইত্যাদি যুক্তিগুলির পূর্ববর্তী হওয়া উচিত।

অবস্থানগত এবং alচ্ছিক আর্গুমেন্ট যথাক্রমে প্যাসআরগ (i) এবং OptArg (i, ডিফল্ট) দিয়ে পুনরুদ্ধার করা যেতে পারে। যখন একটি alচ্ছিক যুক্তি খুঁজে পাওয়া যায় তখন বিকল্পগুলির সন্ধানের প্রারম্ভিক অবস্থানটি (উদাহরণস্বরূপ -i) একটি 'অপ্রত্যাশিত' মারাত্মক মারাত্মক কারণ এড়াতে 1 এগিয়ে চলে যায়।

import os,sys


def HelpAndExit():
    print("<<your help output goes here>>")
    sys.exit(1)

def Fatal(msg):
    sys.stderr.write("%s: %s\n" % (os.path.basename(sys.argv[0]), msg))
    sys.exit(1)

def NextArg(i):
    '''Return the next command line argument (if there is one)'''
    if ((i+1) >= len(sys.argv)):
        Fatal("'%s' expected an argument" % sys.argv[i])
    return(1, sys.argv[i+1])

def PosArg(i):
    '''Return positional argument'''
    if i >= len(sys.argv):
        Fatal("'%s' expected an argument" % sys.argv[i])
    return sys.argv[i]

def OptArg(i, default):
    '''Return optional argument (if there is one)'''
    if i >= len(sys.argv):
        Fatal("'%s' expected an argument" % sys.argv[i])
    if sys.argv[i][:1] != '-':
        return True, sys.argv[i]
    else:
        return False, default


### MAIN
if __name__=='__main__':

    verbose = 0
    debug   = 0
    infile  = "infile"
    outfile = "outfile"
    options_start = 3

    # --- Parse two positional parameters ---
    n1 = int(PosArg(1))
    n2 = int(PosArg(2))

    # --- Parse an optional parameters ---
    present, a3 = OptArg(3,50)
    n3 = int(a3)
    options_start += int(present)

    # --- Parse rest of command line ---
    skip = 0
    for i in range(options_start, len(sys.argv)):
        if not skip:
            if   sys.argv[i][:2] == "-d": debug ^= 1
            elif sys.argv[i][:2] == "-v": verbose ^= 1
            elif sys.argv[i][:2] == "-i": (skip,infile)  = NextArg(i)
            elif sys.argv[i][:2] == "-o": (skip,outfile) = NextArg(i)
            elif sys.argv[i][:2] == "-h": HelpAndExit()
            elif sys.argv[i][:1] == "-":  Fatal("'%s' unknown argument" % sys.argv[i])
            else:                         Fatal("'%s' unexpected" % sys.argv[i])
        else: skip = 0

    print("Number 1 = %d" % n1)
    print("Number 2 = %d" % n2)
    print("Number 3 = %d" % n3)
    print("Debug    = %d" % debug)
    print("verbose  = %d" % verbose)
    print("infile   = %s" % infile)
    print("outfile  = %s" % outfile) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.