ตอนแรกฉันเป็นโปรแกรมเมอร์ C ฉันได้เห็นกลอุบายมากมายและ "แฮ็ก" เพื่ออ่านข้อโต้แย้งที่แตกต่างกันมากมาย
Python โปรแกรมเมอร์สามารถทำอะไรได้บ้าง
ตอนแรกฉันเป็นโปรแกรมเมอร์ C ฉันได้เห็นกลอุบายมากมายและ "แฮ็ก" เพื่ออ่านข้อโต้แย้งที่แตกต่างกันมากมาย
Python โปรแกรมเมอร์สามารถทำอะไรได้บ้าง
คำตอบ:
วิธีการแก้ปัญหาที่ยอมรับในห้องสมุดมาตรฐานคือ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
เลิกใช้แล้วผู้ถามของคำถามจึงไม่ได้เป็นสมาชิกในสแต็คล้นอีกต่อไปและนี่คือคำตอบที่ยอมรับได้สำหรับคำถามที่มองเห็นได้ชัดเจนโปรดพิจารณาการเขียนโค้ดตัวอย่างของคุณใหม่เพื่อใช้ stdlib argparse
แทน
import sys
print("\n".join(sys.argv))
sys.argv
เป็นรายการที่มีข้อโต้แย้งทั้งหมดที่ส่งผ่านไปยังสคริปต์ในบรรทัดคำสั่ง
โดยทั่วไป
import sys
print(sys.argv[1:])
sys.argv[1:]
(หลีกเลี่ยงชื่อสคริปต์)
เพียงแค่ไปรอบ ๆ ประกาศข่าวประเสริฐสำหรับargparseซึ่งจะดีกว่าสำหรับเหล่านี้เหตุผล .. หลัก:
(คัดลอกมาจากลิงค์)
โมดูล argparse สามารถจัดการกับอาร์กิวเมนต์ตำแหน่งและตัวเลือกในขณะที่ optparse สามารถจัดการกับอาร์กิวเมนต์ตัวเลือกเพิ่มเติมเท่านั้น
argparse ไม่เชื่อฟังเกี่ยวกับสิ่งที่อินเตอร์เฟสบรรทัดคำสั่งของคุณควรมีลักษณะ - ตัวเลือกเช่น -file หรือ / file ได้รับการสนับสนุนเช่นเดียวกับตัวเลือกที่จำเป็น Optparse ปฏิเสธที่จะสนับสนุนคุณสมบัติเหล่านี้ต้องการความบริสุทธิ์มากกว่าการใช้งานจริง
argparse สร้างข้อความการใช้งานที่ให้ข้อมูลเพิ่มเติมรวมถึงการใช้บรรทัดคำสั่งที่พิจารณาจากอาร์กิวเมนต์ของคุณและข้อความช่วยเหลือสำหรับทั้งอาร์กิวเมนต์ตำแหน่งและตัวเลือก โมดูล optparse ต้องการให้คุณเขียนสตริงการใช้งานของคุณเองและไม่มีวิธีแสดงความช่วยเหลือเกี่ยวกับข้อโต้แย้งตำแหน่ง
argparse สนับสนุนการกระทำที่ใช้จำนวนตัวแปรของบรรทัดคำสั่ง args ขณะที่ optparse ต้องการให้ทราบจำนวนอาร์กิวเมนต์ที่แน่นอน (เช่น 1, 2 หรือ 3) ล่วงหน้า
argparse สนับสนุนตัวแยกวิเคราะห์ที่ส่งไปยังคำสั่งย่อยในขณะที่ optparse ต้องการการตั้งค่า
allow_interspersed_args
และการส่งตัวแยกวิเคราะห์ด้วยตนเอง
และรายการโปรดส่วนตัวของฉัน:
add_argument()
ด้วย callables ง่าย ๆ ในขณะที่ optparse ต้องการแอตทริบิวต์แฮ็กคลาสเช่น
STORE_ACTIONS
หรือCHECK_METHODS
รับการตรวจสอบอาร์กิวเมนต์ที่เหมาะสม-f
หรือ--foo
ในขณะที่ "ทราบจำนวนที่แน่นอนของข้อโต้แย้งล่วงหน้า" สันนิษฐานว่าเป็นข้อโต้แย้งตำแหน่งที่กำหนดโดยไม่มีธงตัวเลือกก่อนหน้า
นอกจากนี้ยังมีargparse
โมดูล stdlib ("impovement" ในoptparse
โมดูลของ stdlib ) ตัวอย่างจากบทนำสู่ข้อโต้แย้ง :
# 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
docoptห้องสมุดมันเนียน มันสร้างอาร์กิวเมนต์ dict จากสตริงการใช้งานสำหรับแอปของคุณ
เช่นจาก docopt readme:
"""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
python main.py "James Joseph Smith"
? หากคุณมีข้อกังวลเกี่ยวกับการจัดทำดัชนีนอกขอบเขตคุณสามารถเพิ่มการตรวจสอบจำนวนข้อโต้แย้งที่มีให้ ตัวอย่างของฉันเป็นจริงน้อยลงหรือไม่แสดงวิธีจัดการกับอาร์กิวเมนต์หลายตัว
gmail-trash-msg.py MessageID
ฉันเพียงแค่ใช้ คำตอบนี้ตรงไปตรงมาในการทดสอบพารามิเตอร์ได้รับการผ่านในMessageID
sys.argv[1]
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
ฉันใช้ optparse แต่ชอบทิศทางที่ Simon Willison ใช้กับoptfunc library ที่เพิ่งเปิดตัว มันทำงานโดย:
"การตรวจสอบคำจำกัดความของฟังก์ชัน (รวมถึงอาร์กิวเมนต์และค่าเริ่มต้น) และการใช้เพื่อสร้างเครื่องมือแยกวิเคราะห์บรรทัดคำสั่ง"
ตัวอย่างเช่นนิยามฟังก์ชันนี้:
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...")
เมื่อเร็ว ๆ นี้ฉันได้ห่อบางสิ่งที่คล้ายกันนี้เพื่อทำให้สิ่งที่ verbose น้อยลง (เช่น; ทำให้ "-h" โดยนัย)
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
คุณอาจสนใจโมดูล Python เล็กน้อยที่ฉันเขียนเพื่อจัดการอาร์กิวเมนต์บรรทัดคำสั่งได้ง่ายขึ้น (โอเพ่นซอร์สและอิสระในการใช้) - Commando
ฉันขอแนะนำให้ดูที่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()
มันจะสร้างความช่วยเหลือและอื่น ๆ โดยอัตโนมัติและคุณสามารถใช้มัณฑนากรเพื่อให้คำแนะนำเพิ่มเติมเกี่ยวกับวิธีการแยกวิเคราะห์หาเรื่อง
argh
ง่ายกว่าที่ libs sys
อื่นหรือโดยใช้
argh
แต่มันไม่เหมาะอย่างยิ่งสำหรับสถานการณ์ที่ความปรารถนาสูงสุดของคุณไม่ได้มีคำสั่งย่อยที่มีคำสั่งย่อย
def frobnicate_spleches(...)
กำหนดฟังก์ชั่นที่ทำในสิ่งที่สคริปต์ของคุณทำแล้วทำif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
ที่ส่วนท้ายของไฟล์
วิธีการแก้ปัญหาของฉันคือentrypoint2 ตัวอย่าง:
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