相关背景阅读:“sys.argv [1]”是什么意思?(sys.argv是什么,它来自哪里?)。对于更具体的示例,请参见如何实现“[命令] [操作] [参数]”样式的命令行界面?和如何使用Python的optparse格式化位置参数帮助?。
相关背景阅读:“sys.argv [1]”是什么意思?(sys.argv是什么,它来自哪里?)。对于更具体的示例,请参见如何实现“[命令] [操作] [参数]”样式的命令行界面?和如何使用Python的optparse格式化位置参数帮助?。
import sys
print("\n".join(sys.argv))
sys.argv
是一个列表,其中包含传递给命令行脚本的所有参数。 sys.argv[0]
表示脚本名称。
基本上,
import sys
print(sys.argv[1:])
sys.argv[1:]
(避免使用脚本名称)。 - Xiong Chiamiov标准库中的规范解决方案是使用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
已被弃用,问题的提问者不再是Stack Overflow的成员,并且这是一个高度可见的问题的接受答案 - 请考虑完全重写您的示例代码以使用stdlib argparse
代替。 - wim我正在宣传 argparse,相比之下更适合以下情况:这些原因,基本上是:
argparse模块可以处理位置和可选参数,而optparse只能处理可选参数
argparse不会死板地约束你的命令行界面应该是什么样子——支持像-file或/file这样的选项,以及必需选项。Optparse拒绝支持这些功能,更喜欢纯洁而非实用的方式。
argparse生成更多相关的使用消息,包括从您的参数确定的命令行使用和帮助信息,适用于位置和可选参数。optparse模块要求您编写自己的使用字符串,并且没有显示位置参数帮助的方法。
argparse支持消耗变量数量的操作,而optparse需要预先知道精确的参数数量(例如1,2或3)
argparse支持分派到子命令的解析器,而optparse需要设置allow_interspersed_args并手动进行解析器分派
我的个人最爱:
Python标准库还有一个argparse
模块(在标准库的optparse
模块上进行了“改进”)。以下是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
如果你需要快速而且不是很灵活的东西
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
将会产生以下输出:
Hello James Smith
python main.py "James Smith"
,这将在 sys.argv[1]
中放置 James Smith
并在尝试使用不存在的 sys.argv[2]
时产生 IndexError
。引用行为将在您运行Python的平台和shell上有所不同。 - tripleeepython main.py "James Joseph Smith"
时,如何区分Joseph是额外的名字还是姓氏?如果您担心索引越界,可以添加一个检查提供的参数数目的步骤。无论是否更加实际,我的示例展示了如何处理多个参数。 - Kent Munthe Caspersengmail-trash-msg.py MessageID
命令。这个答案很直接,检测 MessageID
参数是否已传递到 sys.argv[1]
。 - WinEunuuchs2Unixdocopt库非常流畅。它从应用程序的使用字符串构建一个参数字典。
例如,来自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)
一种方法是使用sys.argv
。这将打印脚本名称作为第一个参数以及您传递给它的所有其他参数。
import sys
for arg in sys.argv:
print arg
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
我自己使用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
我喜欢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...")