【问题标题】:sys.argv in Python: index out of range message instead of my error messagePython中的sys.argv:索引超出范围消息而不是我的错误消息
【发布时间】:2014-03-12 11:23:40
【问题描述】:

通常我使用一个参数从命令行运行此脚本: python myscript.py 参数

但是当缺少这个参数时,我希望显示错误消息:

用法:myscript.py [文件...]

脚本:

import sys
from lxml import etree

filename = sys.argv[1]

tree = etree.parse(filename)

def f1():
...
def main():
   if len(sys.argv) < 2:
           print 'usage: extract.py [file ...]'
           sys.exit(1)

   else:
      f1()

在我有这个工作之前,我可以在没有参数的情况下显示错误消息,但现在它停止工作,我不明白为什么...... 我只有在没有命令行参数的情况下运行脚本时才会收到此消息:

Traceback (most recent call last):
  File "myscript.py", line 14, in <module>
    filename = sys.argv[1]
IndexError: list index out of range

【问题讨论】:

    标签: python command-line-arguments sys


    【解决方案1】:

    filename = sys.argv[1]首先运行。未达到您的 len() 测试。

    filenametree 的设置移动到main() 函数中,并且不要在此处使用全局变量:

    def f1(tree):
        ...
    
    def main():
        if len(sys.argv) < 2:
            print 'usage: extract.py [file ...]'
            sys.exit(1)
    
        filename = sys.argv[1]
        tree = etree.parse(filename)
    
        f1(tree)
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案2】:

      正如 Martijn 所说,sys.argv[1] 在您测试 len() 之前会被引用。

      我更喜欢将测试移动到调用子句而不是 main,如下所示:

      import sys
      from lxml import etree
      
      def f1(tree):
          pass
      
      def main(filename):
          tree = etree.parse(filename)
          f1(tree)
      
      if __name__=="__main__":
          if len(sys.argv) == 2:
              main(sys.argv[1])
          else:
              print 'usage: extract.py [file ...]'
              sys.exit(1)
      

      我觉得这在代码中提供了更合乎逻辑的职责划分。

      【讨论】:

        【解决方案3】:

        与其做这一切,为什么不使用 python 中的argparse 模块。如果未提供参数,它将自动打印如下使用说明

        import argparse
        parser = argparse.ArgumentParser()
        parser.add_argument('file', type=argparse.FileType('r'))
        args = parser.parse_args()      
        print(args.file)
        

        type=argparse.FileType('r') 参数不是必需的,但最好使用。

        'r'表示并检查文件是否可读或存在。

        同样,您可以使用'w' 来检查您传递的文件是否可写。

        输出:

        $> python progargs.py

        用法:progargs.py [-h] 文件

        progargs.py: 错误:参数太少

        $> python progargs.py testanotherprog.py

        'testanotherprog.py',模式 'r' 在 0x7fe8ee422270>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 2017-07-02
          • 2023-04-10
          相关资源
          最近更新 更多