【问题标题】:Get command line arguments as string以字符串形式获取命令行参数
【发布时间】:2016-10-06 02:29:53
【问题描述】:

我想将所有命令行参数打印为单个字符串。我如何调用我的脚本以及我希望打印什么的示例:

./RunT.py mytst.tst -c qwerty.c

mytst.tst -c qwerty.c

执行此操作的代码:

args = str(sys.argv[1:])
args = args.replace("[","")
args = args.replace("]","")
args = args.replace(",","")
args = args.replace("'","")
print args

我做了所有替换,因为 sys.argv[1:] 返回这个:

['mytst.tst', '-c', 'qwerty.c']

有没有更好的方法来获得相同的结果?我不喜欢那些多次替换调用

【问题讨论】:

    标签: python command-line-arguments


    【解决方案1】:

    一个选项:

    import sys
    ' '.join(sys.argv[1:])
    

    join() 函数通过您调用它的任何字符串连接其参数。所以' '.join(...) 用它们之间的单个空格 (' ') 连接参数。

    【讨论】:

    • 非常感谢!为我工作
    • 当原始参数包含空格并用双引号括起来时,这不起作用,请查看我的答案,它也涵盖了这一点。
    • 我同意 - 这个答案是反模式,因为它不会转义参数中的空格
    • 我们应该考虑szali's answer
    【解决方案2】:

    当您使用从第二个参数到最后一个参数的语法[1:] 时,您将获得一个包含所有参数的列表对象。您可以运行一个 for each 循环将它们连接成一个字符串:

    args = sys.argv[1:]
    result = ''
    
    for arg in args:
        result += " " + arg
    

    【讨论】:

    • 但是你不应该在类(保留关键字)'str'之后命名你的变量。
    • @TryToSolveItSimple 你说的很对,我忘记了我用的是哪种语言 :P 谢谢!
    • 好吧,你忘记了转义符号。此外,连接列表项也不是 Pythonic 方式。
    • 字符串前面有多余的空格
    【解决方案3】:

    命令行参数在发送到sys.argv 之前已经由shell 处理。因此,shell 引用和空格已经消失,无法完全重构。

    假设用户用空格双引号字符串,这里有一个 python 程序用这些引号重构命令字符串。

    commandstring = '';  
    
    for arg in sys.argv[1:]:          # skip sys.argv[0] since the question didn't ask for it
        if ' ' in arg:
            commandstring+= '"{}"  '.format(arg) ;   # Put the quotes back in
        else:
            commandstring+="{}  ".format(arg) ;      # Assume no space => no quotes
    
    print(commandstring); 
    

    例如命令行

    ./saferm.py sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
    

    将产生与输出相同的参数:

    sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
    

    因为用户确实只用字符串双引号。

    【讨论】:

    • 有趣的一点 --- 你是对的,不可能 100% 准确地重建用户的输入。但是,您上面的答案也不适用于 bash 中的单引号字符串 ('foo bar') 或没有空格的双引号字符串 ("foo"),也许还有其他一些 shell。呃,好吧! (此外,我们不能准确地重构参数之间的空白。)
    • ya 目的是不改变命令的动作。即使我们错过了引号,如果它之间不包含任何空格几乎总是无关紧要。所以我们不能指望一个完全匹配但一个有效的匹配,我们可以。
    • 效果很好。这与列表推导相同: commandstring = ' '.join(['"{}"'.format(a) if ' ' in a else '{}'.format(a) for a in sys.argv] )
    • 那么转义双引号/单引号本身呢?
    【解决方案4】:

    之前的答案都没有正确转义所有可能的参数,例如空参数或包含引号的参数。使用最少的代码最接近的方法是使用 shlex.quote(自 Python 3.3 起可用):

    import shlex
    cmdline = " ".join(map(shlex.quote, sys.argv[1:]))
    

    编辑

    这是一个兼容 Python 2+3 的解决方案:

    import sys
    
    try:
        from shlex import quote as cmd_quote
    except ImportError:
        from pipes import quote as cmd_quote
    
    cmdline = " ".join(map(cmd_quote, sys.argv[1:]))
    

    【讨论】:

    • python 2 的任何替代方案?
    • @pushpen.paul,你可以使用pipes.quote。查看我的编辑。
    • 感谢您指出shlex.quote。我认为任何处理 Unix 子进程的细心程序员都应该知道这个重要的 escaping 功能。
    • 如果您只针对 python 3,您可以使用 shlex.join(sys.argv[1:]) 简化此操作
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2020-02-24
    • 2019-12-24
    • 2016-07-30
    相关资源
    最近更新 更多