这是一个简单的Python应用程序,只需打印传入的命令行参数:
import sys if __name__ == "__main__": print "Arguments:" for i in range(len(sys.argv)): print "[%s] = %s" % (i, sys.argv[i])
以下是一些示例运行:
python args.py hello world Arguments: [0] = args.py [1] = hello [2] = world python args.py "hello world" Arguments: [0] = args.py [1] = hello world python args.py "hello\world" Arguments: [0] = args.py [1] = hello\world
到现在为止还挺好.但是现在当我用反斜杠结束任何争论时,Python就会扼杀它:
python args.py "hello\world\" Arguments: [0] = args.py [1] = hello\world" python args.py "hello\" world "any cpu" Arguments: [0] = args.py [1] = hello" world any [2] = cpu
我意识到通过"R"字头(Python的低于理想原始字符串行为链接),它似乎很清楚,它在这里采用相同的行为.
但在这种情况下,我无法控制传递给我的参数,并且我不能强制执行参数不以反斜杠结尾.我如何解决这个令人沮丧的限制?
-
编辑:感谢那些指出这种行为不是特定于Python的人.它似乎是标准的shell行为(至少在Windows上,我目前没有Mac).
更新的问题:我如何接受以反斜杠结尾的args?例如,我的应用程序的一个参数是文件路径.我无法强制执行客户端发送给我,没有反斜杠,或反斜杠转义.这有可能吗?
这可能是shell \
作为转义字符处理,从而逃避角色.所以shell发送\"
为"
(因为它认为你试图逃避双引号).解决方案是逃避转义字符,如下所示:$ python args.py "hello\world\\"
.
末尾的反斜杠被解释为转义序列的开始,在本例中是一个文字双引号字符.我在处理包含路径的环境参数时遇到了类似的问题,该路径有时以\结尾,有时没有.
我想出的解决方案是在调用可执行文件时始终在路径字符串的末尾插入一个空格.然后我的可执行文件使用带有斜杠的目录路径和末尾的空格,这将被忽略.如果导致问题,您可以修改程序中的路径.
如果%SlashPath%="hello"
python args.py "%SlashPath% " world "any cpu" Arguments: [0] = args.py [1] = hello\ [2] = world [3] = any cpu
如果%SlashPath%="hello"
python args.py "%SlashPath% " world "any cpu" Arguments: [0] = args.py [1] = hello [2] = world [3] = any cpu
希望这会给你一些如何解决问题的想法.
Microsoft参数分析规则
这些是解析由CreateProcess()传递给用C/C++编写的程序的命令行的规则:
参数始终用空格或制表符分隔(多个空格/制表符确定)
如果参数不包含任何空格,制表符或双引号,则参数中的所有字符都将按原样接受(不需要将参数括在双引号中).
用双引号括起空格和制表符
双引号部分可以是参数内的任何位置
2n反斜杠后跟"产生n反斜杠+开始/结束双引号部分
2n + 1个反斜杠后跟"产生n个反斜杠+一个文字引号
n反斜杠后面没有引号会产生n个反斜杠
如果关闭"紧跟另一个",则第二个"字面上被接受并添加到参数中(这是未记录的规则.)
有关详细和清晰的说明,请参阅http://www.daviddeley.com/autohotkey/parameters/parameters.htm#WINCRULESDOC