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

Koc*_*T9H 9 python command-line-arguments

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

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

mytst.tst -c qwerty.c
Run Code Online (Sandbox Code Playgroud)

执行该操作的代码:

args = str(sys.argv[1:])
args = args.replace("[","")
args = args.replace("]","")
args = args.replace(",","")
args = args.replace("'","")
print args
Run Code Online (Sandbox Code Playgroud)

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

['mytst.tst', '-c', 'qwerty.c']
Run Code Online (Sandbox Code Playgroud)

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

cxw*_*cxw 22

一个选项:

import sys
' '.join(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

join()函数通过您调用它的任何字符串来连接其参数.因此,' '.join(...)将参数与' '它们之间的单个空格()连接起来.

  • 当原始参数包含空格并用双引号括起来时,这不起作用,请查看我的答案,它也涵盖了这一点. (7认同)
  • 我同意 - 这个答案是反模式,因为它不会在参数中转义空格 (4认同)

Nat*_*hat 7

命令行参数在发送到之前已经由外壳程序处理sys.argv。因此,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); 
Run Code Online (Sandbox Code Playgroud)

例如,命令行

./saferm.py sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
Run Code Online (Sandbox Code Playgroud)

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

sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
Run Code Online (Sandbox Code Playgroud)

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

  • 有趣的是,您说对了,不可能100%地准确地重构用户的输入。但是,上面的答案也不适用于bash中的带单引号的字符串(''foo bar'`)或带双引号的字符串(不带空格)('“ foo”`),以及其他一些shell。呃,好吧!(此外,我们无法完全重建参数之间的空白。) (2认同)

sza*_*ali 6

前面的答案都不能正确地转义所有可能的参数,例如空args或包含引号的参数。使用最少的代码可以得到的最接近的结果是使用shlex.quote(自Python 3.3起可用):

import shlex
cmdline = " ".join(map(shlex.quote, sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)

编辑

这是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:]))
Run Code Online (Sandbox Code Playgroud)

  • 如果你只针对 python 3,你可以使用 shlex.join(sys.argv[1:]) 来简化它 (4认同)