我原来是C程序员。我已经看过许多技巧和“黑客”来阅读许多不同的论点。
Python程序员可以通过哪些方式实现这一目标?
答案 0 :(得分:492)
import sys
print("\n".join(sys.argv))
sys.argv
是一个列表,其中包含在命令行上传递给脚本的所有参数。
基本上,
import sys
print(sys.argv[1:])
答案 1 :(得分:379)
标准库中的规范解决方案是argparse
(docs):
以下是一个例子:
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
支持(除其他外):
答案 2 :(得分:125)
为argparse传播福音,这对于these原因更好..本质上:
(从链接中复制)
argparse模块可以处理位置 和可选参数,而 optparse只能处理可选项 参数
argparse不是教条主义者 你的命令行界面是什么 看起来应该像-file这样的选项 支持或/文件 必需的选项。 Optparse拒绝 支持这些功能,更喜欢 纯度超过实用性
argparse产生更多 信息用法信息,包括 命令行使用情况确定 你的论点和帮助信息 位置和可选 参数。 optparse模块 要求您编写自己的用法 字符串,无法显示 帮助进行位置论证。
argparse支持行动 消耗可变数量的 命令行参数,而optparse 要求确切的数量 参数(例如1,2或3)是已知的 提前
argparse支持解析器
发送到子命令,而
optparse需要设置
allow_interspersed_args
并做了
解析器手动调度
我个人的最爱:
add_argument()
的动作参数
用简单的方式来指定
callables,而optparse需要
黑客类属性就像
得到STORE_ACTIONS
或CHECK_METHODS
适当的参数检查答案 3 :(得分:65)
还有argparse
stdlib module(stdlib optparse
模块的“改进”)。 the introduction to argparse的示例:
# 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
答案 4 :(得分:48)
一种方法是使用sys.argv
。这将打印脚本名称作为第一个参数以及您传递给它的所有其他参数。
import sys
for arg in sys.argv:
print arg
答案 5 :(得分:46)
docopt库真的很光滑。它根据您应用的使用字符串构建参数dict。
例如来自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)
答案 6 :(得分:38)
如果你需要快速而不灵活的东西
<强> 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
产生以下输出:
你好詹姆斯史密斯
答案 7 :(得分:24)
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
答案 8 :(得分:19)
我自己使用optparse,但非常喜欢Simon Willison在他最近推出的optfunc库中所采用的方向。它的工作原理是:
“反省一个功能 定义(包括其论点 和他们的默认值)和使用 那要构造一个命令行 参数解析器。“
所以,例如,这个函数定义:
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
答案 9 :(得分:8)
我喜欢来自stdlib的getopt,例如:
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”)。
答案 10 :(得分:7)
答案 11 :(得分:7)
Pocoo的click更直观,需要更少的样板,并且至少与argparse一样强大。
我到目前为止遇到的唯一弱点是你无法进行太多自定义来帮助页面,但这通常不是必需的,而docopt似乎是明确的选择。它是。
答案 12 :(得分:4)
我建议将docopt视为这些其他人的简单替代方案。
docopt是一个新项目,它通过解析您的--help用法消息而不是要求您自己实现所有内容来工作。您只需将使用消息放在POSIX格式中即可。
答案 13 :(得分:4)
您可能对我编写的一些Python模块感兴趣,以便更轻松地处理命令行参数(开源和免费使用) - Commando
答案 14 :(得分:3)
另一种选择是argh。它建立在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()
它会自动生成帮助等等,你可以使用装饰器来提供关于arg-parsing应该如何工作的额外指导。
答案 15 :(得分:3)
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
答案 16 :(得分:0)
另外,对于python3,您可能会发现使用扩展可迭代解压缩来方便地处理可选的位置参数而没有其他依赖性:
try:
_, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
except ValueError:
print("Not enough arguments", file=sys.stderr) # unhandled exception traceback is meaningful enough also
exit(-1)
以上argv
的解压缩使arg2
和arg3
为“可选”-如果未在argv
中指定,则它们将为None,而如果第一个不是指定,ValueError将被抛出:
Traceback (most recent call last):
File "test.py", line 3, in <module>
_, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
ValueError: not enough values to unpack (expected at least 4, got 3)
答案 17 :(得分:0)
我的解决方案是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