例 10.20. sys.argv
如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序。
#argecho.py
import sys
for arg in sys.argv: print arg
每个传递给程序的命令行参数都在 sys.argv |
例 10.21. sys.argv
[you@localhost py]$ python argecho.py argecho.py
[you@localhost py]$ python argecho.py abc def argecho.py
abc
def
[you@localhost py]$ python argecho.py --help argecho.py
--help
[you@localhost py]$ python argecho.py -m kant.xml argecho.py
-m
kant.xml
关于 sys.argv 需要了解的第一件事情就是:它包含了你正在调用的脚本的名称。你后面会实际使用这个知识,在第 16 章 函数编程中。现在不用担心。 | |
命令行参数通过空格进行分隔。在 sys.argv | |
命令行标志,像 --help,在 sys.argv | |
为了让事情更有趣,有些命令行标志本身就接收参数。比如,这里有一个标记 (-m) 接收一个参数 (kant.xml)。标记自身和标记参数只是 sys.argv |
sys.argv[1] 来访问参数。这没有什么羞耻的;我一直都是这样做的。对更复杂的程序,你需要 getopt
例 10.22. getopt
def main(argv):
grammar = "kant.xml" try:
opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="]) except getopt.GetoptError:
usage()
sys.exit(2)
...
if __name__ == "__main__":
main(sys.argv[1:])
首先,看一下例子的最后并注意你正在调用 main 函数,参数是 sys.argv[1:]。记住,sys.argv[0] | |
这里就是所有有趣处理发生的地方。getopt 模块的 getopt 函数接受三个参数:参数列表 (你从 sys.argv[1:] | |
在解析这些命令行标志时,如果有任何事情错了,getopt 会抛出异常,你可以捕获它。你可以告诉 getopt | |
和 UNIX 世界中的标准实践一样,如果脚本被传入了不能理解的标志,你要打印出正确用法的一个概要并友好地退出。注意,在这里我没有写出 usage |
getopt 函数的参数是什么呢?好的,第一个只不过是一个命令行标志和参数的原始列表 (不包括第一个元素――脚本名称,你在调用 main
"hg:d"
-h
打印用法概要
-g ...
使用给定的语法文件或 URL
-d
在解析时显示调试信息
-g) 必须 跟随一个参数――进行读取的语法文件的名称。实际上,它可以是一个文件名或者一个 web 地址,这时还不知道 (后面会确定),但是你要知道必须要有些东西。所以,你可以通过在 getopt 函数的第二个参数的 g 后面放一个冒号,来向 getopt
-h),也接受长标志 (像 --help),并且你要它们做相同的事。这就是 getopt
["help", "grammar="]
--help
打印用法概要
--grammar ...
使用给定的语法文件或 URL
这里有三点要注意:
- 所有命令行中的长标志以两个短划线开始,但是在调用 getopt
- --grammar 标志的后面必须跟着另一个参数,就像 -g 标志一样。通过等于号标识出来:"grammar="。
- 长标志列表比短标志列表更短一些,因为 -d 标志没有相应的长标志。这很好;只有 -d
被搞昏没?让我们看一下真实的代码,看看它在上下文中是否起作用。