例 10.20. sys.argv

如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序。

#argecho.py
import sys

for arg in sys.argv: print arg



python命令行参数ip地址 python处理命令行参数_python

每个传递给程序的命令行参数都在 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



python命令行参数ip地址 python处理命令行参数_python

关于 sys.argv 需要了解的第一件事情就是:它包含了你正在调用的脚本的名称。你后面会实际使用这个知识,在第 16 章 函数编程中。现在不用担心。

python命令行参数ip地址 python处理命令行参数_命令行_03

命令行参数通过空格进行分隔。在 sys.argv

python命令行参数ip地址 python处理命令行参数_xml_04

命令行标志,像 --help,在 sys.argv

python命令行参数ip地址 python处理命令行参数_python命令行参数ip地址_05

为了让事情更有趣,有些命令行标志本身就接收参数。比如,这里有一个标记 (-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:])



python命令行参数ip地址 python处理命令行参数_python

首先,看一下例子的最后并注意你正在调用 main 函数,参数是 sys.argv[1:]。记住,sys.argv[0]

python命令行参数ip地址 python处理命令行参数_命令行_03

这里就是所有有趣处理发生的地方。getopt 模块的 getopt 函数接受三个参数:参数列表 (你从 sys.argv[1:]

python命令行参数ip地址 python处理命令行参数_xml_04

在解析这些命令行标志时,如果有任何事情错了,getopt 会抛出异常,你可以捕获它。你可以告诉 getopt

python命令行参数ip地址 python处理命令行参数_python命令行参数ip地址_05

和 UNIX 世界中的标准实践一样,如果脚本被传入了不能理解的标志,你要打印出正确用法的一个概要并友好地退出。注意,在这里我没有写出 usage


getopt 函数的参数是什么呢?好的,第一个只不过是一个命令行标志和参数的原始列表 (不包括第一个元素――脚本名称,你在调用 main


"hg:d"


-h 打印用法概要 -g ... 使用给定的语法文件或 URL -d 在解析时显示调试信息

-g) 必须 跟随一个参数――进行读取的语法文件的名称。实际上,它可以是一个文件名或者一个 web 地址,这时还不知道 (后面会确定),但是你要知道必须要有些东西。所以,你可以通过在 getopt 函数的第二个参数的 g 后面放一个冒号,来向 getopt

-h),也接受长标志 (像 --help),并且你要它们做相同的事。这就是 getopt


["help", "grammar="]


--help 打印用法概要 --grammar ... 使用给定的语法文件或 URL

这里有三点要注意:


  1. 所有命令行中的长标志以两个短划线开始,但是在调用 getopt
  2. --grammar 标志的后面必须跟着另一个参数,就像 -g 标志一样。通过等于号标识出来:"grammar="。
  3. 长标志列表比短标志列表更短一些,因为 -d 标志没有相应的长标志。这很好;只有 -d


被搞昏没?让我们看一下真实的代码,看看它在上下文中是否起作用。