मैं मूल रूप से एक सी प्रोग्रामर हूं। मैंने कई अलग-अलग तर्कों को पढ़ने के लिए कई चालें और "हैक" देखा है।
पायथन प्रोग्रामर ऐसा करने के कुछ तरीके क्या कर सकते हैं?
मैं मूल रूप से एक सी प्रोग्रामर हूं। मैंने कई अलग-अलग तर्कों को पढ़ने के लिए कई चालें और "हैक" देखा है।
पायथन प्रोग्रामर ऐसा करने के कुछ तरीके क्या कर सकते हैं?
जवाबों:
मानक पुस्तकालय में विहित समाधान 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
समर्थन (अन्य बातों के अलावा):
optparse
से पदावनत किया गया है, प्रश्न पूछने वाला अब स्टैक ओवरफ्लो पर एक सदस्य नहीं है, और यह एक अत्यधिक दृश्यमान प्रश्न पर स्वीकृत उत्तर है - कृपया argparse
इसके बजाय stdlib का उपयोग करने के लिए अपने उदाहरण कोड को पूरी तरह से फिर से लिखने पर विचार करें ।
import sys
print("\n".join(sys.argv))
sys.argv
एक सूची है जिसमें कमांड लाइन पर स्क्रिप्ट में पारित सभी तर्क शामिल हैं।
मूल रूप से,
import sys
print(sys.argv[1:])
sys.argv[1:]
(स्क्रिप्ट नाम से बचा जाता है)।
बस इन कारणों के लिए बेहतर है जो argparse के लिए प्रचार के आसपास जा रहा है .. अनिवार्य रूप से:
(लिंक से कॉपी किया गया)
चापलूसी मॉड्यूल स्थिति और वैकल्पिक तर्कों को संभाल सकता है, जबकि ऑप्टपर्स केवल वैकल्पिक तर्कों को संभाल सकता है
आपके कमांड लाइन इंटरफ़ेस की तरह क्या दिखना चाहिए, इसके बारे में argparse हठधर्मी नहीं है - आवश्यक विकल्प के रूप में -file या / file जैसे विकल्प समर्थित हैं। इन सुविधाओं का समर्थन करने से इनकार करते हैं, व्यावहारिकता पर शुद्धता पसंद करते हैं
argparse आपके तर्कों से निर्धारित कमांड-लाइन उपयोग सहित और अधिक जानकारीपूर्ण उपयोग संदेश उत्पन्न करता है, और स्थिति और वैकल्पिक तर्क दोनों के लिए संदेशों की मदद करता है। ऑप्टपर्स मॉड्यूल को आपको अपना उपयोग स्ट्रिंग लिखने की आवश्यकता होती है, और स्थिति संबंधी तर्कों के लिए सहायता प्रदर्शित करने का कोई तरीका नहीं है।
argparse ऐसी क्रिया का समर्थन करता है जो कमांड-लाइन आर्ग्स की एक चर संख्या का उपभोग करता है, जबकि ऑप्टपर्स के लिए आवश्यक है कि सटीक संख्या में तर्क (जैसे 1, 2, या 3) पहले से ज्ञात हों।
चापलूसी पार्सरों का समर्थन करता है जो उप-आदेशों को भेजते हैं, जबकि ऑप्टपर्स को allow_interspersed_args
मैन्युअल रूप से पार्सर प्रेषण और सेटिंग की आवश्यकता होती है
और मेरा व्यक्तिगत पसंदीदा:
add_argument()
सरल कॉलबल्स के साथ निर्दिष्ट करने की अनुमति देता है , जबकि ऑप्टपर्स को हैकिंग क्लास विशेषताओं की तरह STORE_ACTIONS
या CHECK_METHODS
उचित तर्क की जांच करने की आवश्यकता होती है
-f
या --foo
, जबकि "सटीक संख्या में तर्क पहले से जाना जाता है" संभवतः पूर्ववर्ती विकल्प झंडे के बिना दिए गए स्थितिगत तर्क।
वहाँ भी है argparse
stdlib मॉड्यूल (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
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
निम्नलिखित उत्पादन का उत्पादन करने के लिए:
नमस्कार जेम्स स्मिथ
python main.py "James Smith"
जो पुट James Smith
में sys.argv[1]
और एक का उत्पादन IndexError
जब आप अस्तित्वहीन इस्तेमाल करने की कोशिश sys.argv[2]
। कोटिंग व्यवहार कुछ हद तक इस बात पर निर्भर करेगा कि आप किस प्लेटफॉर्म और शेल से पायथन चलाते हैं।
python main.py "James Joseph Smith"
? यदि आप सीमा से बाहर सूचकांक से संबंधित हैं, तो आप प्रदान किए गए तर्कों की संख्या के लिए एक चेक जोड़ सकते हैं। कम यथार्थवादी या नहीं, मेरा उदाहरण दिखाता है कि कई तर्कों को कैसे संभालना है।
gmail-trash-msg.py MessageID
। यह उत्तर परीक्षण MessageID
पैरामीटर के लिए सीधे आगे भेजा गया है sys.argv[1]
।
मैं अपने आप को ऑप्टपर्स का उपयोग करता हूं, लेकिन वास्तव में साइमन विलिसन अपने हाल ही में शुरू किए गए ऑप्टोफंक लाइब्रेरी के साथ दिशा ले रहा है । यह इसके द्वारा काम करता है:
"एक फ़ंक्शन परिभाषा (इसके तर्कों और उनके डिफ़ॉल्ट मूल्यों सहित) का आत्मनिरीक्षण करना और कमांड लाइन तर्क पार्सर के निर्माण के लिए इसका उपयोग करना।"
इसलिए, उदाहरण के लिए, इस फ़ंक्शन की परिभाषा:
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
मुझे 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" निहित)।
Pocoo का क्लिक अधिक सहज है, कम बॉयलरप्लेट की आवश्यकता होती है, और कम से कम उतना ही शक्तिशाली है जितना कि argparse।
केवल कमजोरी मैं अब तक का सामना करना पड़ा है कि आप मदद पृष्ठों के लिए बहुत कुछ अनुकूलन नहीं कर सकता है, लेकिन है कि आमतौर पर एक आवश्यकता नहीं है और docopt स्पष्ट विकल्प की तरह लगता है जब यह है।
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
आप एक छोटे अजगर मॉड्यूल में दिलचस्पी ले सकते हैं, जिसे मैंने कमांड लाइन के तर्कों को और भी आसान बनाने के लिए लिखा था (खुला स्रोत और उपयोग करने के लिए स्वतंत्र) - कमांडो
मैं इन दूसरों के लिए एक सरल विकल्प के रूप में डॉकटॉप को देखने की सलाह देता हूं ।
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()
यह स्वचालित रूप से सहायता और इतने पर उत्पन्न करेगा, और आप सज्जाकार का उपयोग अतिरिक्त मार्गदर्शन प्रदान करने के लिए कर सकते हैं कि कैसे आर्ग-पार्सिंग को काम करना चाहिए।
argh
दूसरे कामों की तुलना में आसान है या उपयोग करना sys
।
argh
लेकिन यह उन परिदृश्यों के लिए विशेष रूप से उपयुक्त नहीं है, जहां आपकी अत्यधिक इच्छा सबकोमांड के साथ कमांड रखने की नहीं है।
def frobnicate_spleches(...)
एक फ़ंक्शन को परिभाषित करने के लिए पूरी तरह से संभव लगता है जो आपकी स्क्रिप्ट को जो कुछ भी करता है, if __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
वह फ़ाइल के अंत में कर रहा है।
मेरा समाधान प्रविष्टि 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