如何使用python将转义字符作为命令行参数传递

时间:2015-11-18 13:11:26

标签: python python-2.7 escaping command-line-interface

我编写了一个需要2个命令行参数的python脚本,并且在第二个参数中有一些'&' s。我在&'附近收到了错误zsh解析错误,因此我尝试引用并引用这两个参数,但结果出错了。代码简化如下:

import base64, hmac, urllib, sys  
from hashlib import sha256  
def signature(secret_access_key, string_to_sign):  
    h = hmac.new(secret_access_key, digestmod=sha256)
    h.update(string_to_sign)
    sign = base64.b64encode(h.digest()).strip()  
    return urllib.quote_plus(sign)  
if __name__ == '__main__':  
    secret_access_key = 'a'  
    string_to_sign = 'b\nc\nd&e&f'  
    print signature(secret_access_key, string_to_sign)  
    print signature(sys.argv[1], sys.argv[2])  
    print sys.argv[2] == string_to_sign  

以下是pycharm中的配置 enter image description here
print sys.argv[2] == string_to_sign已返回False
signature(secret_access_key, string_to_sign)的结果是我的预期,但我需要在命令行中传递这两个参数 那么有没有办法在命令行中转义'&''\n'

2 个答案:

答案 0 :(得分:1)

您需要在输入参数周围加上引号:

python yourscript.py "a" "b\nc\nd\&ef"

并更改脚本以使用回车符替换字符串"\n"

import base64, hmac, urllib, sys  
from hashlib import sha256  
def signature(secret_access_key, string_to_sign):  
    h = hmac.new(secret_access_key, digestmod=sha256)
    h.update(string_to_sign)
    sign = base64.b64encode(h.digest()).strip()  
    return urllib.quote_plus(sign)  
if __name__ == '__main__':  
    secret_access_key = 'a'  
    string_to_sign = 'b\nc\nd&e&f'    
    input_argument = sys.argv[2].replace(r'\n','\n')
    print signature(secret_access_key, string_to_sign)  
    print signature(sys.argv[1], input_argument)      
    print input_argument == string_to_sign  

这给出了输出:

iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
iF5JXP343nGyFhcagBhVDVDSnECQpHDMnuq%2F6ryFzBc%3D
True

答案 1 :(得分:1)

如果要包含文字换行符;你可以在bash中使用$'',zsh:

$ python -c'import sys; print(sys.argv)' a $'b\nc\nd&e&f'
['-c', 'a', 'b\nc\nd&e&f']

如果你想要两个字符:反斜杠+ n然后删除$

$ python -c'import sys; print(sys.argv)' a 'b\nc\nd&e&f'
['-c', 'a', 'b\\nc\\nd&e&f']