获取命令行参数作为字符串
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:]))
我想将所有命令行参数打印为一个字符串。我如何调用我的脚本以及我希望打印的内容的示例:
./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:]))