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(...)将参数与' '它们之间的单个空格()连接起来.
命令行参数在发送到之前已经由外壳程序处理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)
因为用户确实只对带字符串的参数加了双引号。
前面的答案都不能正确地转义所有可能的参数,例如空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)