【问题标题】:python argparse how to get entire command as stringpython argparse如何将整个命令作为字符串获取
【发布时间】:2018-09-28 01:59:15
【问题描述】:

我有一个名为patchWidth.py 的脚本,它使用argparse 解析命令行参数:

# read command line arguments -- the code is able to process multiple files
parser = argparse.ArgumentParser(description='angle simulation trajectories')
parser.add_argument('filenames', metavar='filename', type=str, nargs='+')
parser.add_argument('-vec', metavar='v', type=float, nargs=3)

假设这个脚本运行如下:

>>> python patchWidth.py file.dat -vec 0. 0. 1.

有没有办法在 python 中将这整个东西作为字符串获取?我希望能够将使用什么参数运行的命令打印到输出文件。

【问题讨论】:

  • parser.parse_args() 解析sys.argv[1:] 并将sys.argv[0] 用作prog 中的prog 属性usage

标签: python command-line command-line-arguments argparse


【解决方案1】:

是的,你可以使用 sys 模块:

import sys
str(sys.argv) # arguments as string

请注意,argv[0] 是脚本名称。如需更多信息,请查看sys module documentation

【讨论】:

    【解决方案2】:

    我不知道这是否是最好的选择,但是...

    import sys
    
    " ".join(sys.argv)
    

    会返回一个类似/the/path/of/file/my_file.py arg1 arg2 arg3的字符串

    【讨论】:

      【解决方案3】:

      这适用于其中包含空格分隔字符串的命令。

      import sys
      " ".join("\""+arg+"\"" if " " in arg else arg for arg in sys.argv)
      

      样本输出:

      $ python3 /tmp/derp.py "my arg" 1 2 3
      python3 /tmp/derp.py "my arg" 1 2 3
      

      如果有一个带引号的字符串参数,这将不起作用,要解决这个问题,您必须将引号分隔开,例如:arg.replace("\"", "\\\"")。为简洁起见,我省略了它。

      【讨论】:

      • 这是真的,所以+1,但如果引号是单引号,它会失败。如果你已经混合了,但改进将是(" ".join(shlex.quote(arg) if " " in arg else arg for arg in sys.argv)) 所以import shlex 转义单引号
      猜你喜欢
      • 2011-03-08
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2022-06-30
      • 2019-03-21
      相关资源
      最近更新 更多