获取命令行参数作为字符串

Get command line arguments as string

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

./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:] returns 这个:

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

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

一个选项:

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

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

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

args = sys.argv[1:]
result = ''

for arg in args:
    result += " " + arg

命令行参数在发送到 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"

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

None 之前的答案正确地转义了所有可能的参数,例如空参数或包含引号的参数。使用最少的代码最接近的是使用 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:]))