您当前位置: 首页 > 深入 Python > 脚本和流 > 处理命令行参数 | << >> | ||||
深入 Python从 Python 新手到专家 |
Python 完全支持创建可在命令行上运行的程序,并带有完整的命令行参数以及用于指定各种选项的短格式或长格式标志。这些内容都与 XML 无关,但此脚本充分利用了命令行处理,因此现在似乎是提及它的好时机。
如果不了解如何将命令行参数传递给 Python 程序,就很难讨论命令行处理,因此让我们编写一个简单的程序来查看它们。
如果您还没有这样做,则可以 下载本书中使用的此示例和其他示例。
#argecho.py import sys for arg in sys.argv:print arg
[you@localhost py]$ python argecho.pyargecho.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 模块。
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:])
那么,您传递给 getopt 函数的所有这些参数是什么?第一个参数只是命令行标志和参数的原始列表(不包括第一个元素,即脚本名称,您在调用 main 函数之前已经将其切掉)。第二个参数是脚本接受的短命令行标志列表。
第一个和第三个标志只是独立的标志;您可以指定它们,也可以不指定它们,它们会执行操作(打印帮助)或更改状态(打开调试)。但是,第二个标志 (-g) 必须 后跟一个参数,该参数是要从中读取的语法文件的名称。实际上,它可以是文件名或 Web 地址,您还不知道是哪个(稍后您会弄清楚),但您知道它必须是 某个东西。因此,您可以通过在传递给 getopt 函数的第二个参数中的 g 后面放置一个冒号来告诉 getopt。
更复杂的是,该脚本接受短标志(如 -h)或长标志(如 --help),并且您希望它们执行相同的操作。这就是 getopt 的第三个参数的作用,用于指定与您在第二个参数中指定的短标志相对应的长标志列表。
这里需要注意三点
困惑了吗?让我们看一下实际代码,看看它在上下文中是否有意义。
def main(argv):grammar = "kant.xml" try: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts:
if opt in ("-h", "--help"):
usage() sys.exit() elif opt == '-d':
global _debug _debug = 1 elif opt in ("-g", "--grammar"):
grammar = arg source = "".join(args)
k = KantGenerator(grammar, source) print k.output()
<< 按节点类型创建单独的处理程序 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
汇总 >> |