কমান্ড লাইন আর্গুমেন্টগুলি কীভাবে প্রসেস / প্রসেস করবেন?


622

5
ব্যবহারের docopt (এ @ ralbatross এর উত্তর দেখার stackoverflow.com/a/14790373/116891 )। আমি অন্য সমস্ত উপায়ে চেষ্টা করেছি এবং, সত্যই, ডকপটই কেবলমাত্র আমিই এগিয়ে যাব।
প্যাট

2
আমি মনে করি না একমাত্র সেরা উপায় আছে। আরগপার্স মানক এবং বৈশিষ্ট্যযুক্ত। ডকপ্টটি খুব মার্জিত তবে মানক গ্রন্থাগারে নয়। খুব সহজ লাইটওয়েট ব্যবহারের জন্য আপনি ফাংশন ডিফল্ট মানগুলি আপনার জন্য কমন্ড লাইনের আর্গুমেন্ট ডিফল্টগুলি পরিচালনা করতে পারেন
সাইমন হিবিস

উত্তর:


455

স্ট্যান্ডার্ড লাইব্রেরিতে মূল সমাধানটি হ'ল 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 সমর্থন (অন্যান্য জিনিসগুলির মধ্যে):

  • যে কোনও ক্রমে একাধিক বিকল্প।
  • সংক্ষিপ্ত এবং দীর্ঘ বিকল্প।
  • ডিফল্ট মান।
  • একটি ব্যবহার সহায়তা বার্তা উত্পন্ন।

27
হ্যাঁ, এগুলি সেরা। যেহেতু তারা স্ট্যান্ডার্ড লাইব্রেরির অংশ, আপনি নিশ্চিত হতে পারেন যে সেগুলি পাওয়া যাবে এবং সেগুলি ব্যবহার করা সহজ। বিশেষত optparse শক্তিশালী এবং সহজ।
ব্যারি ওয়ার্ক

4
optparse সেরা এক; getopt পুরানো এবং সত্যই অবচয় বিবেচনা করা উচিত।
jemfinch

12
এই মুহুর্তে (12/2011), আরগপার্সকে এখন অপ্ট পার্সির চেয়ে ভাল বিকল্প হিসাবে বিবেচনা করা হচ্ছে, সঠিক?
oob

54
পাইথন ডকুমেন্টেশন অপ্ট পার্সির পরিবর্তে আরগপার্স ব্যবহারের পরামর্শ দেয় ।
আর্থলেলনে

7
যেহেতু optparseঅবহেলিত, প্রশ্নটির প্রশ্নকারী এখন আর স্ট্যাক ওভারফ্লোতে সদস্য নয় এবং এটি একটি অত্যন্ত দৃশ্যমান প্রশ্নের স্বীকৃত উত্তর - দয়া করে argparseপরিবর্তে আপনার stdlib ব্যবহারের জন্য উদাহরণ কোডটি পুনরায় লেখার বিষয়টি বিবেচনা করুন।
wim

548
import sys

print("\n".join(sys.argv))

sys.argv কমান্ড লাইনের স্ক্রিপ্টে দেওয়া সমস্ত আর্গুমেন্ট ধারণ করে এমন একটি তালিকা।

মূলত,

import sys
print(sys.argv[1:])

83
সত্যিই সাধারণ জিনিসগুলির জন্য, এটি যাওয়ার উপায়, যদিও আপনি সম্ভবত কেবল ব্যবহার করতে চান sys.argv[1:](স্ক্রিপ্টের নামটি এড়ানো হয়)।
জিওনগ চিয়ামিভ

128

আরগপার্সের জন্য কেবল সুসমাচার প্রচারের কাছাকাছি যা এই কারণগুলির জন্য ভাল better মূলত:

(লিঙ্ক থেকে অনুলিপি করা)

  • আরগপার্স মডিউল অবস্থানিক এবং alচ্ছিক আর্গুমেন্টগুলি পরিচালনা করতে পারে, যখন অপ্টপার্সি কেবল alচ্ছিক আর্গুমেন্টগুলি পরিচালনা করতে পারে

  • আপনার কমান্ড লাইন ইন্টারফেসটি দেখতে কেমন হবে সে সম্পর্কে আরগপারস কৌতূহলযুক্ত নয় - প্রয়োজনীয় ফাইলগুলি যেমন-ফাইল বা / ফাইল সমর্থিত। Optparse ব্যবহারিকতার চেয়ে বিশুদ্ধতা পছন্দ করে এই বৈশিষ্ট্যগুলিকে সমর্থন করতে অস্বীকার করেছেন

  • আরগপারস আপনার যুক্তি থেকে নির্ধারিত কমান্ড-লাইন ব্যবহার এবং অবস্থানগত এবং alচ্ছিক উভয় যুক্তির জন্য বার্তা সহায়তা সহ আরও তথ্যবহুল ব্যবহারের বার্তা উত্পন্ন করে। অপ্টপার্স মডিউলটির জন্য আপনার নিজের ব্যবহারের স্ট্রিং লিখতে হবে এবং অবস্থানগত আর্গুমেন্টগুলির জন্য সহায়তা প্রদর্শনের কোনও উপায় নেই।

  • আরগপার্সে এমন ক্রিয়াকে সমর্থন করে যা কমান্ড-লাইন আর্গুমেন্টগুলির একটি পরিবর্তনশীল সংখ্যক গ্রাহককে ব্যবহার করে, অপ্টপার্সে আর্গুমেন্টের সঠিক সংখ্যা (যেমন 1, 2, বা 3) আগাম পরিচিত হওয়া দরকার

  • আরগপারস পার্সারগুলিকে সমর্থন করে যা সাব-কমান্ডগুলিতে প্রেরণ করে, যখন অপ্ট পার্সিকে allow_interspersed_argsপার্সার প্রেরণটি ম্যানুয়ালি সেট করা এবং করা দরকার

এবং আমার ব্যক্তিগত প্রিয়:

  • আরগপারস টাইপ এবং অ্যাকশন প্যারামিটারগুলিকে add_argument() সাধারণ কলযোগ্যগুলির সাথে নির্দিষ্ট করার অনুমতি দেয় , যখন অপ্ট পার্সিকে হ্যাকিং শ্রেণীর বৈশিষ্ট্যগুলি পছন্দ করতে STORE_ACTIONSবা CHECK_METHODSযথাযথ যুক্তি পরীক্ষার জন্য প্রয়োজন

27
এটি এখন 2.7 এবং 3.2 :) হিসাবে স্ট্যান্ডার্ড পাইথনের অংশ
jpswain

"Alচ্ছিক যুক্তি" কী কী? আপনি বলছেন যে তারা অপ্টপার্সে আছে। আমি ভেবেছিলাম যে এগুলি যুক্তি ছিল যা সরবরাহ করা হতে পারে বা নাও দেওয়া যেতে পারে, তবে আপনি বলেছিলেন যে তারা অপ্ট পার্সে ছিলেন যখন এই কথা বলতে গিয়েছিলেন যে "অপ্ট পার্সের প্রয়োজন আর্গুমেন্টগুলির সঠিক সংখ্যা আগে থেকেই জানা উচিত"। সুতরাং হয় আপনার "alচ্ছিক যুক্তি" এর সংজ্ঞা আমার যা ভাবা হয়েছে তার থেকে আলাদা বা আপনার উত্তরটি নিজের সাথেই বেমানান।
আর্টঅফ ওয়ারফেয়ার

1
কেবল একটি গ্রিপ: আরগপার্স ডকুমেন্টেশনও অত্যন্ত উন্মাদ, অত্যন্ত জটিল। "আমি কীভাবে একটি কমান্ড লাইন আর্গুমেন্টকে একটি একক মান হিসাবে গ্রহণ করব এবং কীভাবে আমি সেই মানটি অ্যাক্সেস করব" এর সহজ উত্তর পেতে পারেন না। </ripe>
ওসমান

2
@ ওসমান আরগপার্সের এই মৃদু টিউটোরিয়ালটি সাহায্য করতে পারে ...
লাইফবালেন্স

2
এই প্রসঙ্গে @ আর্টঅফ ওয়ার্ফার "alচ্ছিক আর্গুমেন্ট" সম্ভবতঃ বিকল্প মত যুক্তি যেমন যেমন -fবা --foo"যখন যুক্তির সঠিক সংখ্যা আগেই জানা ছিল" এর সাথে যুক্ত নির্দিষ্ট যুক্তিগুলির অর্থ সম্ভবত পূর্ববর্তী কোনও বিকল্পের পতাকা ছাড়াই প্রদত্ত অবস্থানীয় আর্গুমেন্ট।
mtraceur

67

এছাড়াও argparsestdlib মডিউল আছে ( stdlib মডিউলের একটি "ইমপোভমেন্ট" optparse)। আরগপার্সের ভূমিকা থেকে উদাহরণ :

# 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

1
এটি কেবল একটি অনুলিপি এবং পেস্ট করুন
blitu12345

3
আমার উত্তর প্রকাশের সময় @ blitu12345- এর মধ্যে আর কোনও উত্তর নেই যা কোনওভাবেই অর্গপার্সের উল্লেখ করেছে। মডিউলটি নিজেই stdlib এ ছিল না the ডকুমেন্টেশন থেকে কোড উদাহরণগুলির বিরুদ্ধে আপনার কী আছে? আপনি কেন মনে করেন যে মডিউলের লেখকের দেওয়া উদাহরণগুলির পরিবর্তে আপনার নিজের উদাহরণগুলি উপস্থিত করা প্রয়োজন? এবং আমি লিঙ্ক-কেবল উত্তরগুলি পছন্দ করি না (আমি একা নই)।
jfs

1
এখানে আগত লোকদের ডকুমেন্টেশনের মধ্যে ইতিমধ্যে ধারণা ছিল এবং কেবলমাত্র বিষয়টি সম্পর্কে আরও ছাড়পত্রের জন্য এখানে উপস্থিত হবে ame আমার ক্ষেত্রে এটি ছিল তবে আমি যা এখানে পেয়েছি তা মূল ডকস থেকে একটি অনুলিপি এবং আটকানো হয়েছে ea পিস!
blitu12345

2
"এখানে আসার লোকদের ডকুমেন্টেশনের মধ্যে ইতিমধ্যে একটি ধারণা ছিল" - আমি এই অনুমানটি নিয়ে অত্যন্ত সন্দেহ করি। একরকম।
sjas

49

এটি করার একটি উপায় হ'ল ব্যবহার করা sys.argv। এটি স্ক্রিপ্টের নামটিকে প্রথম যুক্তি হিসাবে এবং অন্যান্য পরামিতিগুলিতে প্রিন্ট করবে।

import sys

for arg in sys.argv:
    print arg

49

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)

4
এটি দ্রুত আমার প্রিয় পথে পরিণত হয়েছে। এটা তোলে এর স্ট্রিং পার্স তাই এটি ভঙ্গুর ধরনের, কিন্তু এটি ভঙ্গুর এর এক জায়গায় সব এবং আপনি আপনার যুক্তিবিজ্ঞান পূর্বরূপ দেখতে পারেন try.docopt.org । Alচ্ছিক এবং পারস্পরিক-একচেটিয়া যুক্তিগুলি সত্যই মার্জিত উপায়ে করা হয়।
gvoysey

4
আমি নেভাল_ফেট.পিপির জন্য বাকি কোডটি দেখতে মরিয়া
জন লরেন্স

48

আপনার যদি দ্রুত প্রয়োজন হয় তবে খুব নমনীয় নয়

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

নিম্নলিখিত আউটপুট উত্পাদন করতে:

হ্যালো জেমস স্মিথ


একটি আরো বাস্তবসম্মত ব্যবহার হবে python main.py "James Smith"যা রাখে James Smithমধ্যে sys.argv[1]এবং উত্পাদন করে IndexErrorযখন আপনি অবাস্তব ব্যবহারের চেষ্টা sys.argv[2]। কোথাকার আচরণ কিছুটা নির্ভর করে আপনি কোন প্ল্যাটফর্ম এবং শেল থেকে পাইথনটি চালাচ্ছেন তার উপর।
ট্রিপলি

10
আমি সম্মত নই যে আমার ব্যবহারটি কম বাস্তববাদী। আপনার প্রোগ্রামটি প্রচার করুন এমন কোনও ব্যবসায় যেখানে লোকেরা একাধিক প্রথম এবং শেষ নাম রাখতে পারে সেখানে স্ক্রিপ্ট চালানোর জন্য কোনও ব্যক্তির সঠিক প্রথম এবং শেষ নাম জানতে হবে? যদি জেমস স্মিথের জোসেফকে অতিরিক্ত প্রথম বা শেষ নাম হিসাবে রাখা হয়, তবে আপনি যদি কেবল জোসফের অতিরিক্ত নাম বা পদবি হয়ে থাকেন তবে কীভাবে পার্থক্য হবে python main.py "James Joseph Smith"? আপনি যদি সূচকের বাইরে সীমাবদ্ধতার সাথে সম্পর্কিত হন তবে আপনি সরবরাহিত আর্গুমেন্টের সংখ্যার জন্য একটি চেক যোগ করতে পারেন। কম বাস্তববাদী বা না, আমার উদাহরণটি দেখায় যে কীভাবে একাধিক যুক্তি পরিচালনা করা যায়।
কেন্ট মুন্তে ক্যাস্পারসেন

1
অন্যান্য সমস্ত উত্তর একটি চন্দ্র অবতরণ মিশনের চক্রান্ত করার জন্য। আমি কেবল সহজভাবে ব্যবহার করছি gmail-trash-msg.py MessageID। এই উত্তরটি পরীক্ষার MessageIDপ্যারামিটারটি সোজা এগিয়ে দেওয়া হয়েছে sys.argv[1]
উইনউইউউকস

26
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]

19

আমি নিজে অপ্টপার্স ব্যবহার করি তবে সত্যিকার অর্থে সাইমন উইলিসন তার সম্প্রতি চালু হওয়া অপ্টফান্ক লাইব্রেরির সাথে যে দিকটি নিয়ে যাচ্ছেন ঠিক তার মতোই । এটি এর দ্বারা কাজ করে:

"একটি ফাংশন সংজ্ঞা (এর আর্গুমেন্ট এবং তাদের পূর্বনির্ধারিত মানগুলি সহ) স্বজ্ঞাতকরণ এবং একটি কমান্ড লাইন আর্গুমেন্ট পার্সার তৈরি করতে এটি ব্যবহার করে" "

সুতরাং, উদাহরণস্বরূপ, এই ফাংশন সংজ্ঞা:

def geocode(s, api_key='', geocoder='google', list_geocoders=False):

এই অপ্ট পার্স সহায়তা পাঠ্যে পরিণত হয়েছে:

    Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER

8

আমি স্টাডলিব থেকে আগত পছন্দ করি, যেমন:

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" অন্তর্ভুক্ত করা) তৈরি করতে আমি ইদানীং এর সাথে সামঞ্জস্যপূর্ণ কিছু মোড়ানো করছি।


8

পোকোর ক্লিক আরও স্বজ্ঞাত, কম বয়লারপ্লেটের প্রয়োজন, এবং কমপক্ষে আরগপার্সের মতো শক্তিশালী।

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



5
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

4

কমান্ড লাইন আর্গুমেন্টগুলি পরিচালনা করা আরও সহজ করার জন্য আমি লিখেছিলাম যে পাইথন সামান্য মডিউলটিতে আপনার আগ্রহী হতে পারে (মুক্ত উত্স এবং ব্যবহারের জন্য নিখুঁত) - কমান্ডো


1
কমান্ডো নামে ইতিমধ্যে অন্য কমান্ড-লাইন পার্সিং মডিউল রয়েছে: github.com/lakshmivyas/commando । এটি সাজসজ্জার ব্যবহার করে আরগপার্স মোড়ানো।
রবার্তো বনভোলেট

1
অজগর এবং চাকা পুনরায় আবিষ্কার
ডেরেক

4

আমি ডকোপ্টকে এই অন্যদের জন্য একটি সহজ বিকল্প হিসাবে দেখার পরামর্শ দিই ।

ডকপ্ট একটি নতুন প্রকল্প যা আপনাকে নিজের সবকিছু প্রয়োগ করার প্রয়োজনের পরিবর্তে - - সহায়তা ব্যবহারের বার্তাটি পার্স করে কাজ করে। আপনাকে কেবল আপনার ব্যবহারের বার্তাটি পসিক্স ফর্ম্যাটে রাখতে হবে।


4

তবুও আরেকটি বিকল্প হ'ল আর্গ । এটি আরগপার্সে তৈরি করে এবং আপনাকে এই জাতীয় জিনিস লিখতে দেয়:

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

এটি স্বয়ংক্রিয়ভাবে সহায়তা তৈরি করবে এবং এগুলি এবং আপনি কীভাবে আরগ-পার্সিংয়ের কাজ করা উচিত সে সম্পর্কে অতিরিক্ত নির্দেশিকা সরবরাহ করতে সজ্জকারকে ব্যবহার করতে পারেন।


এটিই সেরা সমাধান। arghঅন্য libs বা ব্যবহারের চেয়ে ব্যবহার সহজ sys
জুয়ানজো সালভাদোর

আমি পছন্দ করতে চেয়েছিলাম arghতবে এটি দৃশ্যের জন্য বিশেষভাবে উপযুক্ত নয় যেখানে আপনার চূড়ান্ত আকাঙ্ক্ষা সাবকম্যান্ডের সাথে আদেশ না রাখার জন্য।
ট্রিপলি

1
@ ট্রিপলই ওয়াইএমএমভি, তবে আমি দেখতে পেয়েছি যে এটি লাইব্রেরির চেয়ে ডকুমেন্টেশনের মধ্যে আরও একটি ত্রুটি ছিল। এটি def frobnicate_spleches(...)কোনও ফাংশন সংজ্ঞায়িত করা পুরোপুরি সম্ভব বলে মনে হচ্ছে যা আপনার স্ক্রিপ্ট যা কিছু if __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)করে ফাইলের শেষে করবে।
বিজ্ঞপ্তি-ধ্বংস

0

আমার সমাধান এন্ট্রিপয়েন্ট 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.