পাইথনে কমান্ড লাইন আর্গুমেন্ট

সংক্ষিপ্ত বিবরণ

পাইথন একটি খুব জনপ্রিয় প্রোগ্রামিং ভাষা হওয়ার সাথে সাথে বেশিরভাগ অপারেটিং সিস্টেম এবং অনেক লাইব্রেরির জন্য সমর্থন রয়েছে যা কমান্ড-লাইন আর্গুমেন্ট প্রক্রিয়াকরণকে সহজ করে তোলে - এটি অনেক উদ্দেশ্যে কমান্ড লাইন টুল তৈরি করতে ব্যাপকভাবে ব্যবহৃত হয়ে উঠেছে। এই টুলগুলি সাধারণ CLI অ্যাপ থেকে শুরু করে আরও জটিল, যেমন AWS' awscli টুল.

এই ধরনের জটিল সরঞ্জামগুলি সাধারণত ব্যবহারকারীর মাধ্যমে নিয়ন্ত্রিত হয় কমান্ড লাইন আর্গুমেন্ট, যা ব্যবহারকারীকে নির্দিষ্ট কমান্ড, সেট অপশন এবং আরও অনেক কিছু ব্যবহার করতে দেয়। উদাহরণস্বরূপ, এই বিকল্পগুলি টুলটিকে অতিরিক্ত তথ্য আউটপুট করতে, একটি নির্দিষ্ট উত্স থেকে ডেটা পড়তে বা একটি নির্দিষ্ট স্থানে আউটপুট পাঠাতে বলতে পারে।

সাধারণভাবে, আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে আর্গুমেন্টগুলি CLI টুলগুলিতে ভিন্নভাবে পাস করা হয়:

  • ইউনিক্সের মতো: - একটি চিঠি দ্বারা অনুসরণ, মত -h, বা -- একটি শব্দ দ্বারা অনুসরণ করা, মত --help
  • উইন্ডোজ: / হয় একটি অক্ষর দ্বারা অনুসরণ করা, বা শব্দ, মত /help

ঐতিহাসিক কারণে এই ভিন্ন পন্থা বিদ্যমান। ইউনিক্স-সদৃশ সিস্টেমের অনেক প্রোগ্রাম একক এবং ডবল ড্যাশ নোটেশন সমর্থন করে। একক ড্যাশ স্বরলিপি বেশিরভাগই একক অক্ষরের বিকল্পগুলির সাথে ব্যবহৃত হয়, যখন ডবল ড্যাশগুলি আরও পাঠযোগ্য বিকল্প তালিকা উপস্থাপন করে, যা বিশেষত জটিল বিকল্পগুলির জন্য দরকারী যেগুলি আরও স্পষ্ট হওয়া প্রয়োজন।

বিঃদ্রঃ: এই নিবন্ধে আমরা শুধুমাত্র ইউনিক্স-এর মতো বিন্যাসে ফোকাস করব - এবং --.

মনে রাখবেন যে একটি আর্গুমেন্টের নাম এবং অর্থ উভয়ই একটি প্রোগ্রামের জন্য নির্দিষ্ট - কিছু সাধারণ নিয়ম ছাড়া অন্য কোন সাধারণ সংজ্ঞা নেই --help টুলের ব্যবহার সম্পর্কে আরও তথ্যের জন্য। পাইথন স্ক্রিপ্টের বিকাশকারী হিসাবে, আপনি সিদ্ধান্ত নেবেন যে কলকারীকে কোন আর্গুমেন্ট দিতে হবে এবং তারা কী করবে। এর জন্য প্রয়োজন সঠিক মূল্যায়ন।

আপনার উপলব্ধ আর্গুমেন্টের তালিকা বাড়ার সাথে সাথে আপনার কোডটি সঠিকভাবে পার্স করার চেষ্টা করার জন্য আরও জটিল হয়ে উঠবে। সৌভাগ্যবশত, পাইথনে আপনাকে সাহায্য করার জন্য অনেকগুলি লাইব্রেরি উপলব্ধ রয়েছে। আমরা কয়েকটি সাধারণ সমাধান কভার করব, যেগুলি "নিজেই করুন" থেকে শুরু করে sys.argv, সঙ্গে "আপনার জন্য সম্পন্ন" পদ্ধতির argparse.

পাইথনের সাথে কমান্ড লাইন আর্গুমেন্ট পরিচালনা করা

Python 3+ এবং চারপাশের ইকোসিস্টেম কমান্ড লাইন আর্গুমেন্ট পরিচালনার বিভিন্ন উপায় সমর্থন করে। সেখানে অনেক লাইব্রেরি যা কমান্ড-লাইন আর্গুমেন্ট পার্সিং সহজতর করে।

অন্তর্নির্মিত উপায় ব্যবহার করা হয় sys মডিউল নাম এবং এর ব্যবহারের ক্ষেত্রে, এটি সরাসরি সি লাইব্রেরির সাথে সম্পর্কিত (libc).

দ্বিতীয় উপায় হল getopt মডিউল, যা প্যারামিটার মানগুলির মূল্যায়ন সহ সংক্ষিপ্ত এবং দীর্ঘ উভয় বিকল্প পরিচালনা করে।

সার্জারির argparse মডিউল, যা থেকে উদ্ভূত হয় optparse মডিউল (পাইথন 2.7 পর্যন্ত উপলব্ধ)।

সার্জারির docopt মডিউল, যা GitHub এ উপলব্ধ, একই কার্যকারিতা অনুমোদন করে।

সম্প্রতি, absl লাইব্রেরিও প্রতিস্থাপনের উপায় হিসাবে বাষ্প লাভ করেছে optparse এবং getopt().

এই পদ্ধতিগুলির প্রতিটিরই তাদের সুবিধা এবং অসুবিধা রয়েছে, তাই কোনটি আপনার প্রয়োজন অনুসারে সবচেয়ে উপযুক্ত তা দেখতে প্রতিটিটির মূল্যায়ন করা মূল্যবান।

sys মডিউল

এটি একটি মৌলিক মডিউল যা পাইথনের সাথে প্রথম দিন থেকে পাঠানো হয়েছে। এটি ব্যবহার করে সি লাইব্রেরির একটি খুব অনুরূপ পদ্ধতির লাগে argc/argv আর্গুমেন্ট অ্যাক্সেস করতে. দ্য sys মডিউল নামের একটি সাধারণ তালিকা কাঠামোতে কমান্ড লাইন আর্গুমেন্ট প্রয়োগ করে sys.argv.

প্রতিটি তালিকা উপাদান একটি একক যুক্তি উপস্থাপন করে। তালিকার প্রথম আইটেম, sys.argv[0], পাইথন স্ক্রিপ্টের নাম। তালিকার বাকি উপাদান, sys.argv[1] থেকে sys.argv[n], কমান্ড লাইন আর্গুমেন্ট 2 থেকে n.

আর্গুমেন্টের মধ্যে একটি সীমানা হিসাবে, একটি স্থান ব্যবহার করা হয়। যে আর্গুমেন্টের মানগুলির মধ্যে একটি স্পেস রয়েছে সেগুলিকে সঠিকভাবে পার্স করার জন্য উদ্ধৃতি দিয়ে ঘিরে থাকতে হবে sys.

এর সমতুল্য argc তালিকায় উপাদানের সংখ্যা মাত্র। এই মানটি পেতে, পাইথন ব্যবহার করুন len() অপারেটর. আমরা পরে এটি একটি কোড উদাহরণে দেখাব।

প্রথম CLI আর্গুমেন্ট প্রিন্ট করা হচ্ছে

এই প্রথম উদাহরণে, আমাদের স্ক্রিপ্ট এটিকে যেভাবে বলা হয়েছিল তা নির্ধারণ করবে। এই তথ্যটি প্রথম কমান্ড লাইন আর্গুমেন্টে রাখা হয়েছে, 0 দিয়ে সূচিত করা হয়েছে। নীচের কোডটি দেখায় যে আপনি কীভাবে আপনার পাইথন স্ক্রিপ্টের নাম পাবেন:

import sys

print("The script has the name %s" % (sys.argv[0])

নামের একটি ফাইলে এই কোডটি সংরক্ষণ করুন arguments-program-name.py, এবং তারপর নিচে দেখানো হিসাবে এটি কল. আউটপুটটি নিম্নরূপ এবং এর সম্পূর্ণ পাথ সহ ফাইলের নাম রয়েছে:

$ python arguments-program-name.py
The script has the name arguments-program-name.py
$ python /home/user/arguments-program-name.py
The script has the name /home/user/arguments-program-name.py

আপনি উপরের দ্বিতীয় কল থেকে দেখতে পাচ্ছেন, আমরা পাইথন ফাইলের নামই শুধু পাই না, এটিকে কল করার জন্য ব্যবহৃত সম্পূর্ণ পথটিও পাই।

আর্গুমেন্ট সংখ্যা গণনা

এই দ্বিতীয় উদাহরণে আমরা বিল্ট-ইন ব্যবহার করে কমান্ড লাইন আর্গুমেন্টের সংখ্যা গণনা করি len() পদ্ধতি। sys.argv আমাদের পরীক্ষা করতে হবে যে তালিকা. নীচের কোডে, আমরা আর্গুমেন্টের সংখ্যা পাই এবং তারপর 1 বিয়োগ করি কারণ সেই আর্গুমেন্টগুলির মধ্যে একটি (অর্থাৎ প্রথমটি) সর্বদা ফাইলের নাম হিসাবে সেট করা থাকে, যা সবসময় আমাদের জন্য উপযোগী হয় না। সুতরাং, ব্যবহারকারী দ্বারা পাস আর্গুমেন্ট প্রকৃত সংখ্যা হয় len(sys.argv) - 1:

import sys


arguments = len(sys.argv) - 1
print ("The script is called with %i arguments" % (arguments))

আর্গুমেন্ট-count.py ফাইলটি সংরক্ষণ করুন এবং নাম দিন। এই স্ক্রিপ্ট কল করার কিছু উদাহরণ নীচে দেখানো হয়েছে. এর মধ্যে তিনটি ভিন্ন পরিস্থিতি রয়েছে:

  • আর কোন কমান্ড লাইন আর্গুমেন্ট ছাড়া একটি কল
  • দুটি যুক্তি সহ একটি কল
  • দুটি আর্গুমেন্ট সহ একটি কল, যেখানে দ্বিতীয়টি একটি স্পেস ধারণকারী একটি উদ্ধৃত স্ট্রিং
$ python arguments-count.py
The script is called with 0 arguments
$ python arguments-count.py --help me
The script is called with 2 arguments
$ python arguments-count.py --option "long string"
The script is called with 2 arguments
আর্গুমেন্টের মাধ্যমে পুনরাবৃত্তি

আমাদের তৃতীয় উদাহরণটি পাইথন স্ক্রিপ্টে প্রেরিত প্রতিটি আর্গুমেন্টকে আউটপুট করে, প্রোগ্রামের নামটি ছাড়া। অতএব, আমরা কমান্ড লাইন আর্গুমেন্ট দিয়ে শুরু করে লুপ করি দ্বিতীয় তালিকা উপাদান। মনে রাখবেন যে এটি সূচক 1 কারণ তালিকাগুলি পাইথনে 0-ভিত্তিক:

import sys


arguments = len(sys.argv) - 1


position = 1
while (arguments >= position):
    print ("Parameter %i: %s" % (position, sys.argv[position]))
    position = position + 1

নীচে আমরা আমাদের কোডকে কল করি, যা arguments-output.py ফাইলে সংরক্ষিত ছিল। আমাদের আগের উদাহরণের মতো, আউটপুট তিনটি ভিন্ন কলকে চিত্রিত করে:

  • কোন যুক্তি ছাড়া একটি কল
  • দুটি যুক্তি সহ একটি কল
  • দুটি আর্গুমেন্ট সহ একটি কল, যেখানে দ্বিতীয় আর্গুমেন্ট হল একটি স্পেস সম্বলিত একটি উদ্ধৃত স্ট্রিং
$ python arguments-output.py
$ python arguments-output.py --help me
Parameter 1: --help
Parameter 2: me
$ python arguments-output.py --option "long string"
Parameter 1: --option
Parameter 2: long string

মনে রাখবেন, উদ্ধৃত স্ট্রিং উদাহরণ দেখানোর পয়েন্ট হল যে প্যারামিটারগুলি সাধারণত একটি স্থান দ্বারা সীমাবদ্ধ করা হয়, যদি না তারা উদ্ধৃতি দ্বারা বেষ্টিত হয়.

আবসেল পতাকা (absl)

Abseil এর ফ্ল্যাগস লাইব্রেরি বিতরণ করা কমান্ড লাইন আর্গুমেন্ট সহ কমান্ড লাইন আর্গুমেন্টকে উৎপাদনে আনার জন্য। যখন একটি মডিউল কমান্ড-লাইন পতাকা ব্যবহার করে এবং অন্য মডিউলে আমদানি করা হয় - অন্য মডিউল পতাকাও আমদানি করে, এবং আমদানিকৃত মডিউলে ফরোয়ার্ড করে সেগুলিকে প্রক্রিয়া করতে পারে৷

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

অতিরিক্তভাবে, লাইব্রেরি আপনাকে আর্গুমেন্টের ডিফল্ট মান, বর্ণনা এবং ডেটা টাইপ সংজ্ঞায়িত করতে দেয়, তাই অতিরিক্ত চেক এবং রূপান্তরের প্রয়োজন নেই।

from absl import flags
import sys


flags.DEFINE_string('name', 'User', 'The name of the user.')


FLAGS = flags.FLAGS
FLAGS(sys.argv)

print(f"Hello {FLAGS.name}!")

সমর্থিত ডেটা প্রকারগুলি হল:

  • DEFINE_integer()
  • DEFINE_string()
  • DEFINE_bool()
  • DEFINE_enum()
  • DEFINE_list()
  • DEFINE_float()

পাশাপাশি DEFINE_multi_integer(), DEFINE_multi_string() এবং DEFINE_multi_enum() মাল্টি-আর্গুমেন্ট ইনপুটের জন্য। উপরন্তু, চলমান --help, --helpfull, ইত্যাদি বিদ্যমান পতাকা এবং তাদের বিবরণ বিভিন্ন বিন্যাসে মুদ্রণ করুন।

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

লাইব্রেরি আপনাকে বৈধতা সংজ্ঞায়িত করার অনুমতি দেয় - উভয় পরিসরের পরিপ্রেক্ষিতে, যেমন পূর্ণসংখ্যা-ভিত্তিক মান upper_bound or lower_bound এটি গ্রহণযোগ্য, এবং মান পরীক্ষা করার জন্য নির্বিচারে পদ্ধতি চালাচ্ছে:

def validate_name(value):
    return len(value) > 15

flags.register_validator('name',
                         validate_name,
                         message='Name is over 15 characters long.',
                         flag_values=FLAGS)

একটি কংক্রিট উদাহরণ হিসাবে এগুলি সংগ্রহ করা:

from absl import flags
import sys

flags.DEFINE_string('name', 'User', 'The name of the user.')
flags.DEFINE_integer('tasks', 0, 'The number of tasks a user has.', lower_bound=0)

FLAGS = flags.FLAGS
FLAGS(sys.argv)

print(f"{FLAGS.name} has {FLAGS.tasks} tasks to work on.")
$ python flags.py --name=John --tasks=5
John has 5 tasks to work on.
$ python flags.py --name=John --tasks=-1

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/absl/flags/_flag.py", line 180, in _parse
    return self.parser.parse(argument)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/absl/flags/_argument_parser.py", line 168, in parse
    raise ValueError('%s is not %s' % (val, self.syntactic_help))
ValueError: -1 is not a non-negative integer
...

আর্গপার্স মডিউল

সার্জারির argparse মডিউল পাইথন 3.2 থেকে পাওয়া যাচ্ছে, এবং এর একটি বর্ধিতকরণ optparse Python 2.7 পর্যন্ত বিদ্যমান মডিউল। পাইথন ডকুমেন্টেশনে একটি API বিবরণ এবং একটি টিউটোরিয়াল রয়েছে যা সমস্ত পদ্ধতি বিস্তারিতভাবে কভার করে।

মডিউলটি একটি প্রমিত আউটপুট সহ একটি কমান্ড লাইন ইন্টারফেস অফার করে, যেখানে আগের দুটি সমাধান আপনার হাতে অনেক কাজ ছেড়ে দেয়। argparse সংক্ষিপ্ত বা দীর্ঘ শৈলী হিসাবে নাম পরীক্ষা সহ স্থির এবং ঐচ্ছিক আর্গুমেন্ট যাচাই করার অনুমতি দেয়। একটি ডিফল্ট ঐচ্ছিক যুক্তি হিসাবে, এটি অন্তর্ভুক্ত -h, এর দীর্ঘ সংস্করণ সহ --help. এই যুক্তিটি একটি ডিফল্ট সাহায্য বার্তা দ্বারা গৃহীত আর্গুমেন্ট বর্ণনা করে।

নীচের কোডটি পার্সার প্রারম্ভিকতা দেখায়, এবং নীচের আউটপুট যা প্রাথমিক কল দেখায়, সাহায্য বার্তা দ্বারা অনুসরণ করে। পাইথন কলগুলির বিপরীতে আমরা আগের উদাহরণগুলিতে ব্যবহার করেছি, এই উদাহরণগুলির সাথে পাইথন 3 ব্যবহার করার কথা মনে রাখবেন:


import argparse


parser = argparse.ArgumentParser()
parser.parse_args()
$ python3 arguments-argparse-basic.py 
$ python3 arguments-argparse-basic.py -h
usage: arguments-argparse-basic.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python3 arguments-argparse-basic.py --verbose
usage: arguments-argparse-basic.py [-h]
arguments-argparse-basic.py: error: unrecognized arguments: --verbose

পরবর্তী ধাপে, আমরা আমাদের ব্যবহারকারীদের জন্য সাহায্য বার্তায় একটি কাস্টম বিবরণ যোগ করব। এইভাবে পার্সার আরম্ভ করা একটি অতিরিক্ত পাঠ্যের অনুমতি দেয়। নীচের কোডটি বিবরণ সংরক্ষণ করে text পরিবর্তনশীল, যা স্পষ্টভাবে দেওয়া হয় argparse হিসাবে ক্লাস description প্যারামিটার নীচের এই কোডটি কল করলে, আপনি দেখতে পারবেন আউটপুটটি কেমন দেখাচ্ছে:


import argparse


text = 'This is a test program. It demonstrates how to use the argparse module with a program description.'


parser = argparse.ArgumentParser(description=text)
parser.parse_args()
$ python3 arguments-argparse-description.py --help
usage: arguments-argparse-description.py [-h]

This is a test program. It demonstrates how to use the argparse module with a
program description.

optional arguments:
  -h, --help  show this help message and exit

চূড়ান্ত পদক্ষেপ হিসাবে আমরা নামের একটি ঐচ্ছিক যুক্তি যোগ করব -V, যার নামের একটি সংশ্লিষ্ট দীর্ঘ শৈলী যুক্তি আছে --version. এটি করার জন্য আমরা পদ্ধতিটি ব্যবহার করি add_argument() যেটিকে আমরা তিনটি প্যারামিটার দিয়ে কল করি (এর জন্য প্রদর্শিত --version, কেবল):

  • পরামিতির নাম: --version
  • প্যারামিটারের জন্য সহায়তা পাঠ্য: help="show program version"
  • ক্রিয়া (অতিরিক্ত মান ছাড়া): action="store_true"

এর জন্য সোর্স কোড নীচে প্রদর্শিত হয়। নামক পরিবর্তনশীল মধ্যে আর্গুমেন্ট পড়া args এর মাধ্যমে করা হয় parse_args() থেকে পদ্ধতি parser বস্তু মনে রাখবেন যে আপনি একটি কলে সংক্ষিপ্ত এবং দীর্ঘ উভয় সংস্করণ জমা দিয়েছেন। অবশেষে, আপনি যদি গুণাবলী পরীক্ষা করুন args.V or args.version সংস্করণ বার্তা সেট এবং আউটপুট করা হয়:


import argparse


parser = argparse.ArgumentParser()
parser.add_argument("-V", "--version", help="show program version", action="store_true")


args = parser.parse_args()


if args.version:
    print("This is myprogram version 0.1")
$ python3 arguments-argparse-optional.py -V
This is myprogram version 0.1
$ python3 arguments-argparse-optional.py --version
This is myprogram version 0.1

সার্জারির --version আর্গুমেন্ট কমান্ড লাইনে একটি মান দিতে হবে না. এই কারণেই আমরা অ্যাকশন আর্গুমেন্ট সেট করেছি "store_true". অন্যান্য ক্ষেত্রে আপনার একটি অতিরিক্ত নির্ধারিত মান প্রয়োজন হতে পারে, উদাহরণস্বরূপ যদি আপনি একটি নির্দিষ্ট ভলিউম, উচ্চতা বা প্রস্থ উল্লেখ করেন। এটি পরবর্তী উদাহরণে দেখানো হয়েছে। একটি ডিফল্ট ক্ষেত্রে, দয়া করে মনে রাখবেন যে সমস্ত আর্গুমেন্ট স্ট্রিং হিসাবে ব্যাখ্যা করা হয়:


import argparse


parser = argparse.ArgumentParser()


parser.add_argument("--width", "-w", help="set output width")


args = parser.parse_args()


if args.width:
    print("Set output width to %s" % args.width)

এখানে আমরা বিভিন্ন আর্গুমেন্ট মান জমা দেওয়ার সময় কী ঘটে তা দেখাই। এতে সংক্ষিপ্ত এবং দীর্ঘ সংস্করণের পাশাপাশি সহায়তা বার্তা অন্তর্ভুক্ত রয়েছে:

$ python3 arguments-argparse-optional2.py -w 10
Set output width to 10
$ python3 arguments-argparse-optional2.py --width 10
Set output width to 10
$ python3 arguments-argparse-optional2.py -h
usage: arguments-argparse-optional2.py [-h] [--width WIDTH]

optional arguments:
  -h, --help            show this help message and exit
  --width WIDTH, -w WIDTH
                        set output width

গেটপট মডিউল

আপনি আগে লক্ষ্য করেছেন হতে পারে, sys মডিউল কমান্ড লাইন স্ট্রিংকে শুধুমাত্র একক দিকগুলিতে বিভক্ত করে। পাইথন getopt মডিউল একটু এগিয়ে যায় এবং পরামিতি বৈধতা দ্বারা ইনপুট স্ট্রিং এর বিচ্ছেদ প্রসারিত করে। উপর ভিত্তি করে getopt সি ফাংশন, এটি একটি মান অ্যাসাইনমেন্ট সহ সংক্ষিপ্ত এবং দীর্ঘ উভয় বিকল্পের অনুমতি দেয়।

অনুশীলনে, এটি প্রয়োজন sys সঠিকভাবে ইনপুট ডেটা প্রক্রিয়া করার জন্য মডিউল। এটি করতে, উভয় sys মডিউল এবং getopt মডিউল আগে লোড করতে হবে। এরপরে, ইনপুট প্যারামিটারের তালিকা থেকে আমরা প্রথম তালিকার উপাদানটি সরিয়ে ফেলি (নীচের কোডটি দেখুন), এবং কমান্ড লাইন আর্গুমেন্টের অবশিষ্ট তালিকাটি নামক ভেরিয়েবলে সংরক্ষণ করি। argument_list:


import getopt, sys


full_cmd_arguments = sys.argv


argument_list = full_cmd_arguments[1:]

print argument_list

মধ্যে আর্গুমেন্ট argument_list এখন ব্যবহার করে পার্স করা যাবে getopts() পদ্ধতি কিন্তু সেটা করার আগে আমাদের বলতে হবে getopts() কোন প্যারামিটারগুলি বৈধ। তারা এই মত সংজ্ঞায়িত করা হয়:

short_options = "ho:v"
long_options = ["help", "output=", "verbose"]

এর মানে হল যে এই আর্গুমেন্টগুলিকে আমরা বৈধ বলে মনে করি, কিছু অতিরিক্ত তথ্য সহ:

------------------------------------------
long argument   short argument  with value
------------------------------------------
--help           -h              no
--output         -o              yes
--verbose        -v              no
------------------------------------------

আপনি হয়তো লক্ষ্য করেছেন যে o সংক্ষিপ্ত বিকল্প একটি কোলন দ্বারা এগিয়ে ছিল, :। এই বলে getopt এই বিকল্পটি একটি মান বরাদ্দ করা উচিত।

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

মূল্যায়নের সময় ত্রুটিগুলি কভার করার জন্য পদ্ধতি কলটি নিজেই একটি ট্রাই-ক্যাচ-বিবৃতিতে রাখা হয়। একটি ব্যতিক্রম উত্থাপিত হয় যদি একটি যুক্তি আবিষ্কৃত হয় যা পূর্বে সংজ্ঞায়িত তালিকার অংশ নয়। পাইথন স্ক্রিপ্ট ত্রুটি বার্তাটি স্ক্রিনে প্রিন্ট করবে এবং ত্রুটি কোড 2 দিয়ে প্রস্থান করবে:

try:
    arguments, values = getopt.getopt(argument_list, short_options, long_options)
except getopt.error as err:
    
    print (str(err))
    sys.exit(2)

অবশেষে, সংশ্লিষ্ট মানের সাথে আর্গুমেন্ট নামক দুটি ভেরিয়েবলে সংরক্ষণ করা হয় arguments এবং values. এখন, আপনি সহজেই আপনার কোডে এই ভেরিয়েবলগুলি মূল্যায়ন করতে পারেন। আমরা একটি ব্যবহার করতে পারেন for-স্বীকৃত আর্গুমেন্টের তালিকার মাধ্যমে পুনরাবৃত্তি করতে লুপ, পরেরটির পর একটি এন্ট্রি।


for current_argument, current_value in arguments:
    if current_argument in ("-v", "--verbose"):
        print ("Enabling verbose mode")
    elif current_argument in ("-h", "--help"):
        print ("Displaying help")
    elif current_argument in ("-o", "--output"):
        print (("Enabling special output mode (%s)") % (current_value))

নীচে আপনি এই কোড নির্বাহ থেকে আউটপুট দেখতে পারেন. আমরা দেখাব কিভাবে প্রোগ্রাম বৈধ এবং অবৈধ উভয় প্রোগ্রাম আর্গুমেন্টের সাথে প্রতিক্রিয়া করে:

$ python arguments-getopt.py -h
Displaying help
$ python arguments-getopt.py --help
Displaying help
$ python arguments-getopt.py --output=green --help -v
Enabling special output mode (green)
Displaying help
Enabling verbose mode
$ python arguments-getopt.py -verbose
option -e not recognized

আমাদের প্রোগ্রামের শেষ কলটি প্রথমে কিছুটা বিভ্রান্তিকর বলে মনে হতে পারে। এটি বোঝার জন্য, আপনাকে জানতে হবে যে শর্টহ্যান্ড বিকল্পগুলি (কখনও কখনও পতাকাও বলা হয়) একক ড্যাশের সাথে একসাথে ব্যবহার করা যেতে পারে। এটি আপনার টুলটিকে আরও সহজে অনেকগুলি বিকল্প গ্রহণ করতে দেয়৷ উদাহরণস্বরূপ, কল করা python arguments-getopt.py -vh কল করার মতই python arguments-getopt.py -v -h. তাই উপরে শেষ কল, getopt মডিউল ভেবেছিল ব্যবহারকারী পাস করার চেষ্টা করছে -e একটি বিকল্প হিসাবে, যা অবৈধ।

উপসংহার

এই নিবন্ধে আমরা পাইথনে কমান্ড লাইন আর্গুমেন্ট পুনরুদ্ধার করার জন্য বিভিন্ন পদ্ধতি দেখিয়েছি, ব্যবহার সহ sys, getopt, এবং argparse. এই মডিউলগুলি কার্যকারিতার মধ্যে পরিবর্তিত হয়, কিছু অন্যদের তুলনায় অনেক বেশি প্রদান করে। sys সম্পূর্ণ নমনীয়, যেখানে উভয় getoptএবং argparse কিছু কাঠামো প্রয়োজন। বিপরীতে, তারা বেশিরভাগ জটিল কাজ কভার করে sys আপনার উপর ছেড়ে দেয়। প্রদত্ত উদাহরণগুলির মাধ্যমে কাজ করার পরে, আপনি নির্ধারণ করতে সক্ষম হবেন যে কোন মডিউলটি আপনার প্রকল্পের জন্য সবচেয়ে উপযুক্ত।

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

তথ্যসূত্র

সময় স্ট্যাম্প:

থেকে আরো Stackabuse